我尝试使用llvm / clang在主机x64上为目标arm进行交叉编译。我知道需要sysroot和gcc-toolchain,它们的标志指向目标平台的gcc编译器。我很困惑gcc工具链是否应该在目标拱门上运行?或者应该是一个交叉工具链,可以在主机架构上运行,但可以为目标架构编译?我交叉编译了一个简单的hello world,使用了一个目标arch gcc工具链作为sysroot。但是,必须使用llvm lld进行链接。我相信这可能与无法运行提供ld的gcc工具链有关。
am46iovg1#
GCC是一个编译器,clang是另一个编译器。你只需要两个中的一个。您可以使用GNUbinutils来链接编译器的输出,但这不是GCC。无论在交叉编译期间运行什么程序,都必须为构建系统(x64)构建,并配置为允许针对目标系统(ARM)。P.S.也许你应该看看我的项目:https://github.com/DavidEGrayson/nixcrpkgs。它展示了如何使用GCC(而不是clang)在x64 Linux上为ARM Linux进行交叉编译。
to94eoyn2#
--sysroot不使用指定位置的编译器。(我不认为它在那里使用任何可执行文件。)它主要使用头文件和库。我不确定它是否会在默认情况下尝试使用sysroot中的链接器,但如果您使用-fuse-ld=lld,这就没关系了。LLD似乎可以连接大多数常见的平台。例如,我正在使用从Windows复制的MinGW sysroot从Linux交叉编译到Windows(因此其中的可执行文件都不能在Windows上运行),Clang对此没有问题。
--sysroot
-fuse-ld=lld
2条答案
按热度按时间am46iovg1#
GCC是一个编译器,clang是另一个编译器。你只需要两个中的一个。您可以使用GNUbinutils来链接编译器的输出,但这不是GCC。
无论在交叉编译期间运行什么程序,都必须为构建系统(x64)构建,并配置为允许针对目标系统(ARM)。
P.S.也许你应该看看我的项目:https://github.com/DavidEGrayson/nixcrpkgs。它展示了如何使用GCC(而不是clang)在x64 Linux上为ARM Linux进行交叉编译。
to94eoyn2#
--sysroot
不使用指定位置的编译器。(我不认为它在那里使用任何可执行文件。)它主要使用头文件和库。我不确定它是否会在默认情况下尝试使用sysroot中的链接器,但如果您使用
-fuse-ld=lld
,这就没关系了。LLD似乎可以连接大多数常见的平台。例如,我正在使用从Windows复制的MinGW sysroot从Linux交叉编译到Windows(因此其中的可执行文件都不能在Windows上运行),Clang对此没有问题。