64位Ubuntu16.04交叉编译Cortex A9程序遇头文件缺失,需定义_ARM_PCS_VFP?
gnu/stubs-soft.h缺失的问题 先给你明确结论:是的,你需要在Makefile中定义_ARM_PCS_VFP,但这只是解决问题的关键一步,还得配合正确的编译选项和依赖库配置才能彻底搞定。
问题根源拆解
Cortex-A9是带VFP硬件浮点单元的ARMv7架构芯片,而gnu/stubs-soft.h是为软浮点(softfloat)ABI设计的头文件。你遇到这个错误,本质是交叉编译环境的ABI配置不匹配:要么编译器默认用了硬浮点ABI,但代码或隐式编译逻辑试图调用软浮点相关的头文件;要么你的工具链缺少对应ABI的标准库文件。
定义_ARM_PCS_VFP的作用是告诉编译器:我们要使用硬浮点的过程调用标准(PCS),这样编译器就不会去寻找软浮点专属的stubs-soft.h了。
完整解决步骤
在Makefile中添加正确的编译宏和架构选项
把下面的配置加到你的CFLAGS里,既定义宏,又明确指定Cortex-A9的硬件特性:CFLAGS += -D_ARM_PCS_VFP -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16-march=armv7-a:指定目标架构为ARMv7-A(Cortex-A9属于这个架构)-mfloat-abi=hard:启用硬浮点ABI,直接用硬件FPU处理浮点运算-mfpu=vfpv3-d16:指定使用VFPv3浮点单元(Cortex-A9原生支持这个版本)
安装对应硬浮点ABI的标准库
在64位Ubuntu 16.04上,默认可能没装ARM硬浮点的开发库,执行下面的命令补上:sudo apt-get install libc6-dev-armhf-cross这个包包含了硬浮点ABI所需的所有头文件和库文件,能彻底解决头文件缺失的问题。
确认交叉工具链前缀正确
确保你用的是硬浮点工具链前缀arm-linux-gnueabihf-,而不是软浮点的arm-linux-gnueabi-。比如编译时应该用arm-linux-gnueabihf-gcc,而不是旧的软浮点编译器。
额外提醒
如果你的目标系统特殊要求必须用软浮点(但Cortex-A9有硬件FPU,完全没必要这么做),那你需要安装软浮点库libc6-dev-armel-cross,并把编译选项改成-mfloat-abi=soft或-mfloat-abi=softfp,但这会浪费硬件浮点性能,不推荐。
内容的提问来源于stack exchange,提问作者hal2000

