c++ - clang交叉编译命令找不到头文件
问题描述
我正在尝试使用 clang 10.0 进行简单的交叉编译,遵循官方教程,带有选项--target=<triple>
。
我的环境是64 位 ubuntu16.04,clang10.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.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
推荐阅读
- javascript - 如何将此 JavaScript 代码添加到 Zapier,以发出第 3 方礼物?
- json - Pentaho Kettle:将两个 Unix 日期时间列转换为一个
- django - 在生产运行时运行 Django 检查
- asp.net - ASP.NET Core 如何添加 SuperWebSocketServer
- asp.net - Asp.net - 从访问本地服务器问题的设备获取 IP 地址
- unix - 在实用程序节点上安装 puppet
- ruby-on-rails - 如何手动包含remotipart js?
- python - 在 PyCharm 中为 ipython 配置终端仿真器
- javascript - 在 react 的 useState 中插入正则表达式无效
- async-await - 如何使用量角器和 browser.wait 每次都给出相同的结果?