ARM编译错误,VFP注册使用可执行文件,而不是对象文件

过去几天我一直有这个问题,我无法理解这里发生的事情,或者是什么问题。

我有这些标志的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文件中的库,它有一些目标文件,我所需要做的就是将它们与我的可执行文件链接起来。 我知道原型和所有这些,唯一抱怨的是以下几点:

 /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(ao) does not /usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(ao) /usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(bo) does not /usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(bo) /usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(co) does not /usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(co) /usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(do) does not /usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(do) /usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(eo) does not /usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(eo) /usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(fo) does not /usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(fo) collect2: ld returned 1 exit status make: *** [perf_test] Error 1 

您的目标三元组表示您的编译器configuration为硬浮动 ABI。 这意味着libgcc库也将是hardfp。 错误消息表明至less有一部分系统正在使用软浮动 ABI。

如果编译器启用了multilib(你可以用-print-multi-lib ),那么你可以使用-mfloat-abi=softfp ,但是如果没有,那么这个选项对你来说就没有多大的帮助了:gcc会很乐意的生成softfp代码,那么将没有兼容的libgcc链接。

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

编辑:有些发行版是,或将是“多元化”。 如果你有其中一个,那么可以同时安装两个 ABI,但是这样做是把所有东西都加倍 – 兼容性问题依然存在。

我发现在glibc binutils和gcc被交叉编译的arm hardfloat系统上,使用gcc给出了同样的错误。

它通过导出-mfloat-abi=hard来解决,然后gcc编译没有错误。

此外,错误可以通过添加几个标志,如-marm -mthumb-interwork来解决。 对我来说避免这个相同的错误是有帮助的。

这是猜测,但您可能需要为链接阶段提供部分或全部浮点相关开关。

在我的情况下, CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft已经帮了你。 正如你所看到的,我用它为我的stm32f407。

也使用相同的编译器选项进行链接。

例:

 gcc -mfloat-abi=hard fpu=neon -c -o test.cpp test.o gcc -mfloat-abi=hard fpu=neon -c test1.cpp test1.o gcc test.o test1.o mfloat-abi=hard fpu=neon HardTest 

我在STM32F4上遇到了使用Atollic for ARM的问题(我想它适用于所有带有FPU的STM32)。

使用SW浮点数对我来说效果不佳(因此编译正确)。

当STM32cubeMX为TrueStudio(Atollic)生成代码时,它不会在C / C ++构build设置中设置FPU单元(不知道其他IDE的生成代码)。

“目标”中为(在项目属性构build设置下)设置一个FPU:

  • 汇编
  • C编译器
  • C连接器

然后您可以select混合硬件/软件fp或使用硬件。

生成的命令行添加到预期的目标:

 -mfloat-abi=hard -mfpu=fpv4-sp-d16 

arm atollic

在我的具体情况-g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork工作。

这个答案可能会出现在不相关的表面,但是这个错误信息有一个间接的原因。

首先,“使​​用VFP注册…”的错误信息是由你的版本中混合mfloat-abi = soft和mfloat-abi = hard选项直接引起的。 对于所有要链接的对象,此设置必须一致。 这个问题的其他答案也包含了这个事实。

这个错误的间接原因可能是由于Eclipse编辑器被项目的“.cproject”文件中的自我错误所迷惑。 Eclipse编辑器经常重新烧写文件链接,有时当你改变你的目录结构或文件位置时,它自行破坏。 这也会影响到gcc编译器的path设置,并且只影响项目文件的一部分。 尽pipe我还不确定导致此故障的原因,但使用备份副本replace.cproject文件为我纠正了这个问题。 在我的情况下,我注意到.java.null.pointer错误后添加一个包含目录path,并开始收到“VFP注册错误”的信息。 在构build日志中,我注意到gcc编译器的不同path被用于工作区本地的一些源,但不是全部! 两个gcc编译器使用不同的浮动设置为未知的原因 – 因此VFP注册错误。

我将.cproject设置与较旧的副本进行了比较,并且观察到引起问题的源的条目差异 – 即使禁用了项目设置的重写。 通过用旧版本replace.cproject文件,问题消失了,我将这个答案留作提醒。