使用arm-linux-gnueabihf交叉编译时stdlib.h报错求助
刚接触交叉编译踩这个坑太正常了,我帮你分析下问题根源和具体的解决办法:
首先看你遇到的报错:stdlib.h:133:35: error: missing binary operator before token "(" #if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT),这个错误出在工具链自带的头文件里,说明预处理器处理宏逻辑时出了问题,结合你的编译命令和环境,核心问题有两个:
1. 用C编译器编译C++代码
你的源文件是BatteryStatus.cpp(C文件),但你用了arm-linux-gnueabihf-gcc——这是C语言的编译器,用来编译C代码时,会对C特有的宏、语法支持不足,导致工具链头文件里的C兼容宏逻辑失效,触发预处理器错误。
修复方式:把编译命令里的arm-linux-gnueabihf-gcc换成arm-linux-gnueabihf-g++,这是工具链自带的C编译器,能正确处理C代码和对应的标准库头文件。
2. 错误引入了主机系统的头文件
你在编译命令里加了-I/usr/include,这个路径是你CentOS主机(x86_64架构)的系统头文件目录!交叉编译ARM目标程序时,绝对不能引入主机的头文件——工具链已经自带了适配ARM架构的标准库头文件,引入主机头文件会直接破坏工具链头文件的宏定义逻辑,这正是你看到stdlib.h报错的直接原因。
修复方式:直接删掉编译命令里的-I/usr/include参数。
修正后的完整编译命令
把上面两个问题修复后,你的命令应该改成这样:
~/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -Isrc -std=c++11 -Wall -Wno-unknown-pragmas -O0 -g3 -D__DEBUG_BUILD__ -DDEVELOPMENT -MMD -c -o "Debug/src/BatteryStatus.o" "src/BatteryStatus.cpp"
额外排查建议
如果修复后还是有问题,可以试试这两个操作:
- 检查你的
BatteryStatus.cpp或它包含的头文件,有没有手动引入主机系统的头文件(比如#include <some_header.h>里的头文件不在你的src目录也不在工具链里) - 在编译命令末尾加
-v参数,查看头文件搜索路径:
输出里的~/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -v -Isrc -std=c++11 -Wall -Wno-unknown-pragmas -O0 -g3 -D__DEBUG_BUILD__ -DDEVELOPMENT -MMD -c -o "Debug/src/BatteryStatus.o" "src/BatteryStatus.cpp"#include <...> search starts here:部分,应该只有工具链的路径和你的src目录,绝对不能出现/usr/include这类主机路径。
内容的提问来源于stack exchange,提问作者Wenjie Zhong

