我正在尝试使用clang 10.0和official tutorial以及选项--target=<triple>
进行简单的交叉编译。
我的环境位于 64位ubuntu16.04 , clang10.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)主机应如何准备与其他目标计算机的交叉编译?
任何答案将不胜感激!
答案 0 :(得分:0)
除编译器外,您还需要sysroot(其中存在所有头文件和运行时库)才能成功编译。如果编译器找不到sysroot的路径,则它将不知道在哪里可以找到标准库头等。
如果您的系统没有i386工具链,则需要下载具有sysroot的编译器工具链。例如从这里开始:https://github.com/nativeos/i386-elf-toolchain/releases。
clang++ --target=i386-unknown-linux-gnu --sysroot /path/to/sysroot a.cpp
类似地,您可以从以下网址下载工具链:https://launchpad.net/gcc-arm-embedded/+download
要了解有关工具链和sysroot的更多信息,请阅读:https://elinux.org/Toolchains