c++ - clang交叉编译命令找不到头文件

标签 c++ compilation clang

我正在尝试使用 clang 10.0 进行简单的交叉编译,然后是 official tutorial , 带有选项 --target=<triple> .

我的环境是64位ubuntu16.04clang10.0

我的源文件就是a.cpp文件:

#include <iostream>

int main() {
  std::cout << "hello world" << std::endl;
  return 0;
}

如果我用 clang++ --target=x86_64-unknown-linux-gnu a.cpp 编译主机的源代码,效果很好。但是如果我使用 clang++ --target=i386-unknown-linux-gnu a.cpp对于 32 位机器,或 clang++ --target=arm-unknown-linux-eabi a.cpp ,它得到了同样的错误:

a.cpp:18:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.

我的问题是:

1)我的编译命令是否有误?

2) 宿主机要交叉编译到其他目标机应该准备什么?

任何答案将不胜感激!

最佳答案

除了编译器之外,您还需要 sysroot,其中包含所有头文件和运行时库,才能成功编译。如果编译器找不到 sysroot 的路径,它就不知道在哪里可以找到标准库头文件等。

如果您的系统没有 i386 工具链,那么您需要下载具有 sysroot 的编译器工具链。例如来自这里:https://github.com/nativeos/i386-elf-toolchain/releases .

clang++ --target=i386-unknown-linux-gnu --sysroot /path/to/sysroot a.cpp

与 arm 类似,您可以从以下位置下载工具链:https://launchpad.net/gcc-arm-embedded/+download

要了解有关工具链和 sysroot 的更多信息,请阅读:https://elinux.org/Toolchains

关于c++ - clang交叉编译命令找不到头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59209040/

相关文章:

c++ - 什么时候使用按位运算而不是算术运算?

ios - 如何为Xcode6制作插件

c++ - 为什么这个 TAD 返回 0.0000 而不是相关函数的结果?

c++ - llvm 文档示例无法编译

language-agnostic - 详尽描述 cpu 体系结构以编写可重定向编译器的文件

c++ - 如何为 Linux C++ 应用程序获取 timespec_add_safe()

C++ 将(静态)const 全局变量设置为另一个静态 const 变量时出现编译器错误

c++ - 类模板的名称是否在限定的外部析构函数定义的范围内?

c++ - 如何检查通过引用返回的函数的正确操作数?

c++ - 我该如何实现一个奇怪的 "class"符号