我在64位Ubuntu 16.04上为32位Cortex A9平台交叉编译helloworld程序时遇到了以下错误。
$ make
/usr/local/comp/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mtune=cortex-a9 --sysroot=/usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi -Iinclude -Wall -O3 -c -o main.o main.c
In file included from /usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/features.h:389:0,
from /usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/stdio.h:27,
from main.c:5:
/usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
# include <gnu/stubs-soft.h>
^
compilation terminated.
makefile:45: recipe for target 'main.o' failed
make: *** [main.o] Error 1
然后我检查了stubs.h文件的内容:
$ cat /usr/local/comp/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/usr/include/gnu/stubs.h
/* This file is automatically generated.
This file selects the right generated file of `__stub_FUNCTION' macros
based on the architecture being compiled for. */
#if !defined __ARM_PCS_VFP
# include <gnu/stubs-soft.h>
#endif
#if defined __ARM_PCS_VFP
# include <gnu/stubs-hard.h>
#endif
我应该在makefile中定义_ARM_PCS_VFP
吗?
答案 0 :(得分:9)
从交叉编译器的名称“cortexa9hf-vfp-neon-poky-linux-gnueabi”开始,它针对的是采用VFP架构并启用了霓虹灯的Cortex-A9。添加-mfloat-abi=hard
开关应该可以解决问题。
来自GCC手册:
-mfloat-ABI =名:
指定要使用的浮点ABI。允许的值是: 'soft','softfp'和'hard'。
指定'soft'会导致GCC生成包含库的输出 调用浮点运算。 'softfp'允许生成 代码使用硬件浮点指令,但仍然使用 软浮动调用约定。 'hard'允许生成 浮点指令并使用FPU特定的调用约定。
默认值取决于特定的目标配置。注意 硬浮动和软浮动ABI不兼容链路;你必须 使用相同的ABI编译整个程序,并用a链接 兼容的图书馆。