gcc - ARM 编译错误,VFP 寄存器由可执行文件使用,而不是目标文件

标签 gcc compilation arm

过去几天我一直遇到这个问题,我无法理解这里到底发生了什么,或者问题是什么。

我有一个带有这些标志的 makefile:

CC = arm-linux-gnueabihf-gcc-4.6
FLAGS = -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -std=gnu99

我在 .a 文件中有一个库,其中有一些目标文件,我所需要做的就是将它们与我的可执行文件链接起来。我知道原型(prototype)等等,唯一提示的是:

/usr/bin/ld: error: *EXECUTABLE* uses VFP register arguments, *OBJECTFILE* does not
/usr/bin/ld: failed to merge target specific data of file *OBJECTFILE*

当我不使用 -mfloat-abi=softfp 时,我收到另一个与浮点寄存器相关的错误。

有谁知道导致此问题的原因以及我可以采取哪些措施来解决此问题,例如使我的可执行文件不使用虚拟浮点寄存器参数?

x@x:~/Desktop/perf_test$ make
arm-linux-gnueabihf-gcc-4.6 -c -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -std=gnu99 -mfloat-abi=softfp  perf_test.c ../baseline/util.c
arm-linux-gnueabihf-gcc-4.6 -o perf_test perf_test.o util.o  ../baseline/lib.a
/usr/bin/ld: error: perf_test uses VFP register arguments, perf_test.o does not
/usr/bin/ld: failed to merge target specific data of file perf_test.o
/usr/bin/ld: error: perf_test uses VFP register arguments, util.o does not
/usr/bin/ld: failed to merge target specific data of file util.o
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(a.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(a.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(b.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(b.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(c.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(d.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(d.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(e.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(e.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(f.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(f.o)
collect2: ld returned 1 exit status
make: *** [perf_test] Error 1

最佳答案

您的目标三元组表明您的编译器已配置为硬浮点 ABI。这意味着libgcc 库也将是hardfp。该错误消息表明您的系统至少有一部分正在使用soft-float ABI。

如果编译器启用了 multilib(您可以使用 -print-multi-lib 来判断),那么您可以使用 -mfloat-abi=softfp,但如果没有,则该选项不会对您有太大帮助:gcc 会很乐意生成 softfp 代码,但随后将没有兼容的 libgcc 可供链接。

基本上,hardfp 和 softfp 不兼容。您需要以一种或另一种方式配置整个系统。

编辑:某些发行版是或将是“多架构”。如果您有其中一个,则可以同时安装两个 ABI,但这是通过将所有内容加倍来完成的 - 兼容性问题仍然存在。

关于gcc - ARM 编译错误,VFP 寄存器由可执行文件使用,而不是目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753749/

相关文章:

无法使预编译头与arm-none-eabi-gcc一起工作

docker Ubuntu 16.04 中的 Linux 编译 - 未创建依赖文件

gcc - 如何从 GCC 插件在目标文件中嵌入元数据

python - 安装 lxml : Error: open CFI at the end of file; missing . cfi_endproc 指令

CSS 未在本地环境的 PrestaShop 站点上编译 (theme.css)

compilation - Toolkit.UWP 更新到 V5.0 后,应用程序无法在 X64 中编译(但在 X86 中正确编译)

c - 具有不同步进源的 Tiva ADC 定序器

c++ - 为什么 GCC 只是通过将其置于循环中而被欺骗以允许未定义的行为?

gcc - 为什么在 vim 和 emacs 中使用 clang 进行自动完成?

c - Makefile:没有链接问题的编译