我正在为ARM Cortex-M4F目标交叉编译项目 . 我已经在Windows 7 PC上成功交叉编译了这个项目数月,现在我也可以从Linux环境(在Windows环境中的虚拟机中运行)交叉编译它 . 使用完全相同的可移植Makefile完成构建,因此编译器和链接器调用完全相同,路径除外 .

虽然在Windows上一切顺利,但是当调用链接器时,我在Linux(Ubuntu 18.04)上有一堆错误(所有文件的编译顺利):

/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 compilation error, VFP registered used by executable, not object file以及How to (cross-)compile to both ARM hard- and soft-float (softfp) with a single GCC (cross-)compiler?的问题和答案,尽管它们对于理解问题的一部分非常有帮助,但它们都没有让我找到解决方案 .

在两个操作系统上我使用arm-none-eabi-gcc V6.3.1:

Windows 7 64-bit

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

Ubuntu 18.04

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

两者似乎都有类似的多库:

Windows 7 64-bit

. ;拇指; @mthumb很难; @ mfloat-abi =硬拇指/ v6-m; @ mthumb @ march = armv6s -m thumb / v7-m; @ mthumb @ march = armv7-m thumb / v7e-m; @ mthumb @ march = armv7e-m thumb / v7-ar; @ mthumb @ march = armv7 thumb / v8-m.base; @ mthumb @ march = armv8-m.base thumb / 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 = hard 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 = hard 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 = hard 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 = hard 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=hard 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 = hard

Ubuntu 18.04

. ;拇指; @mthumb很难; @ mfloat-abi =硬拇指/ v6-m; @ mthumb @ march = armv6s -m thumb / v7-m; @ mthumb @ march = armv7-m thumb / v7e-m; @ mthumb @ march = armv7e-m thumb / v7-ar; @ 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 = hard 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 = hard 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 = hard拇指/ V7-AR / fpv3 /硬/定; @ mthumb @行军= ARMv7的@ mfpu = vfpv3可使-D16 @ mfloat-ABI =硬@ mbig端

从我非常重要的事情来指定我们是否需要硬浮动或软浮动实现 . 我想使用硬件,所以每个gcc调用(汇编编译器,C编译器,链接器)都有这两个标志:

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

以下是其他编译器标志:

-ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -short-enums -MP -MD

和链接器标志:

-Xlinker -mthumb -mabi = aapcs -mcpu = cortex-m4 -lrdimon -u _printf_float --specs = nano.specs -lc -lnosys -Wl, - gc-sections

我根本没有看到这些错误消息的原因是什么,因为每次都指定实现 . 我唯一的假设是一些libs(比如我们在错误中看到的lib_a-nano)是为软实现而构建的 . 但是,让我们说这是问题,如何使用为硬实现构建的相同的lib?