尝试将大型gcc / makefile项目转换为clang。大致可以在x86上使用,但是现在我正在尝试使交叉编译正常工作。
当前的工作方式是,我们将Linaro的7.1.1 arm编译器与其配套的sysroot目录一起使用,用于基础库/头。我安装了clang-6.0,然后安装了基本clang(不确定是否重要)。 当我执行'clang -v'并得到
时,我使用了一些命令,将clang重定向到clang-6.0。Block-2
找不到我们使用的当前编译器,位于
clang version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
....
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/9
....
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6.5.0
....
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
我仅找到设置--sysroot的引用,但没有找到特定的编译器。关于clang + llvm +其他编译器之间的关系,绝对仍然迷失了。我什至看到某个地方说我需要先编译llvm才能使用它?
我非常粗略地修改了make文件,以获取以下输出,基本上我只需要添加“ -target arm-linux-gnueabuhf”并重新排序了mcpu / mfloat / marm / march,因此它们排在-target之后以防万一
/usr/local/gcc-linaro-7.1.1-2017.08-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++(also a directory for *x86_64*)
我认为问题可能出在我所做的更改上,该更改是替换为
的实际“铛”调用clang --sysroot=/usr/local/sysroot-glibc-linaro-2.25-2017.08-arm-linux-gnueabihf -c -std=c++0x
-g -DDEBUG_ON -target arm-linux-gnueabihf -mcpu=cortex-a7 -mfloat-abi=hard -marm -march=armv7ve
-Wall -fexceptions -fdiagnostics-show-option -Werror .... -I/usr/local/gcc-linaro-7.1.1-2017.08-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/include .... and many more
最后
/usr/local/gcc-linaro-7.1.1-2017.08-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ ....
如前所述,我已经可以与gcc进行交叉编译,因此我已经遇到了需要“ build-essentials”,“ g ++-multilibs”等标准库的问题。因此,它们已经安装。 / p>
看起来并且真的没有找到对我有用的东西,我在linux mint 18.3上,我发现最接近的东西是人们在Mac和Windows上遇到的问题。
答案 0 :(得分:0)
因此,我遇到了一些提到设置--gcc-toolchain = / your / choice / of / cross / compiler的帖子,但他们也提到它不起作用。我发现,如果将它与llvm-6.0-dev(或者可能是llvm-6.0-tools的工具,而不是100%安装了dev的工具)的安装结合起来,至少对我有用。
答案 1 :(得分:0)
任何编译器clang
或gcc
都需要知道头文件的定义位置。对于每个target
,例如arm64,x86,标准头文件,标准库,c-runtime和libc都打包在一起在名为“ sysroot”的目录中。当我们编译程序时,我们需要将路径传递给sysroot,以便编译器知道在编译过程中在哪里寻找标准头文件,以及在链接过程中在哪里寻找公共库(libc,libstdc ++等)。
通常,当我们在同一台机器上编译程序时,编译器会使用'/ usr / include'中可用的标准头文件以及'/ usr / lib'中的库文件。在交叉编译程序时,我们应提供sysroot作为编译器标志。例如gcc --sysroot="/path/to/arm64/sysroot/usr" test.cpp
。叮当也一样。多数情况下,预打包的交叉编译器附带一个脚本/二进制文件,其中嵌入了“ sysroot”路径。例如aarch64-linux-gnu-gcc(https://packages.ubuntu.com/xenial/devel/gcc-aarch64-linux-gnu)。
...我发现最接近的东西是人们在Mac和Windows上遇到的问题。
在Mac上,clang编译器的配置与linux类似。因此,您在此处找到的详细信息应该完全适用于您自己。
有关sysroot和交叉编译的更多详细信息:
https://elinux.org/images/1/15/Anatomy_of_Cross-Compilation_Toolchains.pdf