首页 > 解决方案 > clang交叉编译命令找不到头文件

问题描述

我正在尝试使用 clang 10.0 进行简单的交叉编译,遵循官方教程,带有选项--target=<triple>

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

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

#include <iostream>

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

如果我用 comile 主机的源代码clang++ --target=x86_64-unknown-linux-gnu a.cpp,它运行良好。但是,如果我使用clang++ --target=i386-unknown-linux-gnu a.cpp32 位机器,或者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) 宿主机与其他目标机交叉编译需要准备什么?

任何答案将不胜感激!

标签: c++compilationclang

解决方案


除了编译器之外,您还需要存在所有头文件和运行时库的 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


推荐阅读