clang交叉编译–sysroot需要一个交叉编译器吗?还是目标架构编译器?

huangapple go评论83阅读模式
英文:

Does clang cross compilation —sysroot require a cross compiler? Or target arch compiler?

问题

我正在尝试在 x64 主机上使用 llvm/clang 为 arm 目标进行交叉编译。我知道需要一个 sysroot 和 gcc-toolchain,并且它们的标志指向目标平台的 gcc 编译器。

我不确定 gcc 工具链是否应该是在目标架构上运行的?还是应该是一个可以在主机架构上运行但可以为目标架构编译的交叉工具链?

我已经使用目标架构的 gcc 工具链作为 sysroot 来交叉编译了一个简单的 hello world,但不得不使用 llvm 的 lld 进行链接。我认为这可能与无法运行提供的 gcc 工具链的 ld 有关。

英文:

I am attempting to cross compile on host x64 for target arm using llvm / clang. I know a sysroot and gcc-toolchain are required, and their flags point to a gcc compiler for the target platform.

I’m confused whether the gcc toolchain should be one that runs on the target arch? Or should it be a cross toolchain that can run on the host arch but compile for the target arch?

I have cross compiled a simple hello world using a target arch gcc toolchain as the sysroot. But, had to use llvm lld for linking. I believe this may be related to not being able to run the gcc toolchains provided ld?

答案1

得分: 3

GCC是一个编译器,而clang是另一个编译器。你只需要其中一个。你可能会使用GNU binutils来链接编译器的输出,但那不是GCC。

在进行交叉编译期间运行的任何程序都必须针对构建系统(x64)构建,并配置为允许定位到目标系统(ARM)。

附言:也许你应该看一下我的项目:https://github.com/DavidEGrayson/nixcrpkgs。它展示了如何在x64 Linux上使用GCC(而不是clang)进行ARM Linux的交叉编译。

英文:

GCC is a compiler and clang is a different compiler. You only need one of the two. You might use GNU binutils to link the output of the compiler, but that is not GCC.

Whatever programs you run during cross compilation must be built for the build system (x64), and be configured to allow targeting the target system (ARM).

P.S. Maybe you should look at my project: https://github.com/DavidEGrayson/nixcrpkgs . It shows how to cross-compile on x64 Linux for ARM Linux using GCC (not clang).

答案2

得分: 1

--sysroot 不使用指定位置的编译器。(我认为它根本不使用那里的任何可执行文件。)它主要使用头文件和库。

我不确定它是否会默认使用 sysroot 中的链接器,但如果你使用 -fuse-ld=lld,这就不重要了。似乎 LLD 可以链接到大多数常见的平台。

例如,我正在从 Linux 交叉编译到 Windows,使用了从 Windows 复制的 MinGW sysroot(因此其中的任何可执行文件都无法在 Windows 上运行),而 Clang 可以很好地处理。

英文:

--sysroot doesn't use the compiler at the specified location. (I don't think it uses any executables in there at all.) It primarily uses headers and libraries.

I'm not sure if it would try to use the linker from the sysroot by default or not, but this won't matter if you use -fuse-ld=lld. It seems LLD can link for most common platforms.

E.g. I'm cross-compiling from Linux to Windows using a MinGW sysroot copied from Windows (so none of the executables in it can run on Windows), and Clang is fine with it.

huangapple
  • 本文由 发表于 2023年5月14日 03:43:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/76244587.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定