使用clang指定target/sysroot交叉编译时找不到头文件如何解决?
交叉编译ARM目标时Clang找不到C++标准头文件解决方案
核心问题定位
从编译日志可以明确根因:
Clang默认使用LLVM自带的libc++ C++标准库实现,默认搜索sysroot下的include/c++/v1路径。而你使用的GNU Arm Embedded Toolchain自带的是GCC的libstdc++标准库,头文件存放于带版本号的include/c++/10.3.1目录下,和Clang的默认搜索路径不匹配,因此日志明确提示ignoring nonexistent directory "C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.07\arm-none-eabi\include\c++\v1",最终找不到标准头文件。
解决方案
按以下步骤调整编译命令即可:
- 明确指定使用
libstdc++作为标准库,添加-stdlib=libstdc++参数 - 添加
-nostdinc++参数,禁止Clang搜索自身的libc++头文件路径 - 手动通过
-isystem指定GNU工具链的libstdc++头文件路径,包括通用头路径和对应thumbv7m架构的专属头路径 - 若后续链接阶段报错找不到标准库,还需通过
-L指定对应架构的libstdc++静态库路径
调整后的编译命令示例(Windows环境)
clang++ --target=thumbv7m-none-eabi --sysroot "C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.07\arm-none-eabi" ^ -stdlib=libstdc++ -nostdinc++ ^ -isystem "C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.07\arm-none-eabi\include\c++\10.3.1" ^ -isystem "C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.07\arm-none-eabi\include\c++\10.3.1\arm-none-eabi\thumb\v7-m" ^ -c example.cpp -v
路径校验说明
如果执行命令仍提示头文件不存在,直接在你的GNU Arm工具链安装目录下搜索algorithm文件,即可拿到实际的头文件存放路径,替换上述命令中的对应路径即可。
内容的提问来源于stack exchange,提问作者Garphunkle
相关产品推荐
相关产品推荐

