clang / llvm编译致命错误:找不到“ cstdarg”文件

时间:2019-11-27 02:29:31

标签: clang llvm llvm-clang

尝试将大型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上遇到的问题。

2 个答案:

答案 0 :(得分:0)

因此,我遇到了一些提到设置--gcc-toolchain = / your / choice / of / cross / compiler的帖子,但他们也提到它不起作用。我发现,如果将它与llvm-6.0-dev(或者可能是llvm-6.0-tools的工具,而不是100%安装了dev的工具)的安装结合起来,至少对我有用。

答案 1 :(得分:0)

任何编译器clanggcc都需要知道头文件的定义位置。对于每个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