“ARM交叉编译”;注册的VFP由x.out而非y.o使用;Linux上的问题,但Windows上的问题

“ARM交叉编译”;注册的VFP由x.out而非y.o使用;Linux上的问题,但Windows上的问题,linux,gcc,linker,arm,cross-compiling,Linux,Gcc,Linker,Arm,Cross Compiling,我正在为ARM Cortex-M4F目标交叉编译一个项目。我已经在Windows7 PC上成功地交叉编译这个项目好几个月了,现在我还必须能够从Linux环境(在Windows环境中的虚拟机上运行)交叉编译它。构建是使用完全相同的可移植Makefile完成的,因此编译器和链接器调用除了路径之外完全相同 虽然在Windows上一切都进行得很顺利,但在Linux((仿生海狸))上调用链接器时,我遇到了一系列错误(所有文件的编译都进行得很顺利): /usr/lib/gcc/arm-none-eabi/6

我正在为ARM Cortex-M4F目标交叉编译一个项目。我已经在Windows7 PC上成功地交叉编译这个项目好几个月了,现在我还必须能够从Linux环境(在Windows环境中的虚拟机上运行)交叉编译它。构建是使用完全相同的可移植Makefile完成的,因此编译器和链接器调用除了路径之外完全相同

虽然在Windows上一切都进行得很顺利,但在Linux((仿生海狸))上调用链接器时,我遇到了一系列错误(所有文件的编译都进行得很顺利):

/usr/lib/gcc/arm-none-eabi/6.3.1/../../../../../arm-none-eabi/bin/ld:错误:/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o:冲突的CPU架构13/1

/usr/lib/gcc/arm-none-eabi/6.3.1/../../../../../../arm-none-eabi/bin/ld:未能合并文件/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm none-eabi/lib/crt0.o的目标特定数据

myProgram.out使用VFP寄存器参数,/usr/lib/gcc/arm none-eabi/6.3.1/../../../../../arm none-eabi/lib/libc_nano.a(lib_a-nano-vfprintf_i.o)不[更像这样…]

我已经阅读了的问题和答案,虽然它们确实有助于理解问题的一部分,但没有一个能让我找到解决方案

在这两种操作系统上,我都使用arm none eabi gcc V6.3.1:

Windows 7 64位

gcc版本6.3.1 20170215(发布)[ARM/embedded-6-branch修订版245512](适用于ARM嵌入式处理器的GNU工具6-2017-q1-update)

Ubuntu 18.04

gcc版本6.3.1 20170620(15:6.3.1+svn253039-1build1)

两者似乎都有相似的多重库:

Windows 7 64位

)
拇指@mthumb
硬的@mfloat abi=硬
拇指/v6-m@mthumb@march=armv6s-m
拇指/v7-m@mthumb@march=armv7-m
拇指/v7e-m@mthumb@march=armv7e-m
拇指/V7AR@mthumb@march=armv7
拇指/v8-m.底座@mthumb@march=armv8-m.base
拇指/v8-m.main@mthumb@march=armv8-m.main
thumb/v7e-m/fpv4 sp/softfp@mthumb@march=armv7e-m@mfpu=fpv4 sp-d16@mfloat-abi=softfp
thumb/v7e-m/fpv4 sp/hard@mthumb@march=armv7e-m@mfpu=fpv4 sp-d16@mfloat-abi=硬
thumb/v7e-m/fpv5 sp/softfp@mthumb@march=armv7e-m@mfpu=fpv5 sp-d16@mfloat-abi=softfp
thumb/v7e-m/fpv5 sp/hard@mthumb@march=armv7e-m@mfpu=fpv5 sp-d16@mfloat-abi=硬
thumb/v7e-m/fpv5/softfp@mthumb@march=armv7e-m@mfpu=fpv5-d16@mfloat-abi=softfp
thumb/v7e-m/fpv5/hard@mthumb@march=armv7e-m@mfpu=fpv5-d16@mfloat-abi=硬
thumb/v7 ar/fpv3/softfp@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-abi=softfp
thumb/v7 ar/fpv3/hard@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-abi=硬
thumb/v8-m.main/fpv5-sp/softfp@mthumb@march=armv8-m。main@mfpu=fpv5 sp-d16@mfloat-abi=softfp
thumb/v8-m.main/fpv5-sp/hard@mthumb@march=armv8-m。main@mfpu=fpv5 sp-d16@mfloat-abi=硬
thumb/v8-m.main/fpv5/softfp@mthumb@march=armv8-m。main@mfpu=fpv5-d16@mfloat-abi=softfp
thumb/v8-m.main/fpv5/hard@mthumb@march=armv8-m。main@mfpu=fpv5-d16@mfloat-abi=硬

Ubuntu 18.04

)。; 拇指@mthumb
硬的@mfloat abi=硬
拇指/v6-m@mthumb@march=armv6s-m
拇指/v7-m@mthumb@march=armv7-m
拇指/v7e-m@mthumb@march=armv7e-m
拇指/V7AR@mthumb@march=armv7
thumb/v7e-m/fpv4 sp/softfp@mthumb@march=armv7e-m@mfpu=fpv4 sp-d16@mfloat-abi=softfp
thumb/v7e-m/fpv4 sp/hard@mthumb@march=armv7e-m@mfpu=fpv4 sp-d16@mfloat-abi=硬
thumb/v7e-m/fpv5/softfp@mthumb@march=armv7e-m@mfpu=fpv5-d16@mfloat-abi=softfp
thumb/v7e-m/fpv5/hard@mthumb@march=armv7e-m@mfpu=fpv5-d16@mfloat-abi=硬
thumb/v7 ar/fpv3/softfp@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-abi=softfp
thumb/v7 ar/fpv3/hard@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-abi=硬
thumb/v7 ar/fpv3/hard/be@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-阿比=hard@mbig-恩迪安

根据我在这里和那里读到的内容,非常重要的是指定我们是想要硬浮点实现还是软浮点实现。我想使用硬件,因此每个gcc调用(汇编编译器、C编译器、链接器)都有这两个标志:

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

以下是其他编译器标志:

-f函数节-fdata节-fno严格别名-fno内置-短枚举-MP-MD

和链接器标志:

-Xlinker-mthumb-mabi=aapcs-mcpu=cortex-m4-lrdimon-u\u printf\u float-specs=nano.specs-lc-lnosys-Wl,--gc部分


由于每次都指定了实现,所以我在这里根本看不到这些错误消息的原因。我唯一的假设是,一些库(比如我们在错误中看到的lib_a-nano)是为软实现而构建的。但假设这就是问题所在,如何使用为硬实现构建的相同库?

-mcpu=cortex-m4-为什么这是链接器标志,而不是编译器标志?
-mcpu
应该是
每个gcc调用都有这些标志的一部分。那么`-mthumb-mabi=aapc`也是吗?如果前面没有
-Xlinker
?@KamilCuk问得好,我不知道为什么我在问题中没有提到它,但我确认编译器和链接器都提供了此标志。