gpt4 book ai didi

gcc - 如何使用单个 GCC(交叉)编译器(交叉)编译为 ARM 硬浮点和软浮点 (softfp)?

转载 作者:行者123 更新时间:2023-12-03 03:39:21 30 4
gpt4 key购买 nike

我想使用单个(交叉)编译器来编译不同 ARM 调用约定的代码:因为我总是想使用浮点和 NEON 指令,所以我只想选择硬浮点调用约定或软浮点(softfp)调用约定。

我的编译器默认为硬浮点,但它支持我需要的两种架构:

$ arm-linux-gnueabihf-gcc -print-multi-lib
.;
arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft
$

当我使用默认参数编译时:

$ arm-linux-gnueabihf-g++ -Wall -o hello_world_armhf hello_world.cpp

成功,没有任何错误。

如果我使用 -print-multi-lib 返回的参数进行编译:

$ arm-linux-gnueabihf-g++ -marm -march=armv4t -mfloat-abi=soft -Wall -o hello_world hello_world.cpp

它再次编译,没有错误(顺便问一下,我如何测试生成的代码是硬 float 还是软 float ?)

不幸的是,如果我尝试这样做:

$ arm-linux-gnueabihf-g++ -march=armv7-a -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -Wall -o hello_world hello_world.cpp
[...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: error: hello_world uses VFP register arguments, /tmp/ccwvfDJo.o does not
[...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: failed to merge target specific data of file /tmp/ccwvfDJo.o
collect2: error: ld returned 1 exit status
$

我已经测试了参数的一些其他排列,但似乎除了 -print-multi-lib 显示的组合之外的任何内容都会导致错误。

我已阅读 ARM compilation error, VFP registered used by executable, not object file但问题是二进制文件的某些部分是软 float 的,而另一些则是硬 float 的。我有一个 C++ 文件要编译...

我错过了哪些参数可以使用 -march=armv7-a -mthumb-interwork -mfloat-abi=softfp -mfpu=neon 进行编译?

当我在命令行中明确使用 -mfloat-abi=softfp 禁止 VFP 寄存器参数时,错误怎么可能与 VFP 寄存器参数有关?

谢谢!

根据记录,hello_world.cpp 包含以下内容:

#include <iostream>

int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}

最佳答案

您需要另一个具有相应多库支持的编译器。您可以使用下一个命令检查多库支持。

arm-none-eabi-gcc -print-multi-lib
.;
thumb;@mthumb
fpu;@mfloat-abi=hard
armv6-m;@mthumb@march=armv6s-m
armv7-m;@mthumb@march=armv7-m
armv7e-m;@mthumb@march=armv7e-m
armv7-ar/thumb;@mthumb@march=armv7
cortex-m7;@mthumb@mcpu=cortex-m7
armv7e-m/softfp;@mthumb@march=armv7e-m@mfloat-abi=softfp@mfpu=fpv4-sp-d16
armv7e-m/fpu;@mthumb@march=armv7e-m@mfloat-abi=hard@mfpu=fpv4-sp-d16
armv7-ar/thumb/softfp;@mthumb@march=armv7@mfloat-abi=softfp@mfpu=vfpv3-d16
armv7-ar/thumb/fpu;@mthumb@march=armv7@mfloat-abi=hard@mfpu=vfpv3-d16
cortex-m7/softfp/fpv5-sp-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=softfp@mfpu=fpv5-sp-d16
cortex-m7/softfp/fpv5-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=softfp@mfpu=fpv5-d16
cortex-m7/fpu/fpv5-sp-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=hard@mfpu=fpv5-sp-d16
cortex-m7/fpu/fpv5-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=hard@mfpu=fpv5-d16
https://stackoverflow.com/questions/37418986/how-to-interpret-the-output-of-gcc-print-multi-lib

How to interpret the output of gcc -print-multi-lib通过此配置,gcc -mfloat-abi=hard 不仅会使用 FPU 指令构建文件,还会将它们与相应的库链接,从而避免 "X uses VFP register arguments, Y does not"错误。

上述由 gcc 生成的 -print-multi-lib 输出 this patch--with-multilib-list=armv6-m,armv7,armv7-m,armv7e-m,armv7-r,armv7-a,cortex-m7 配置选项。如果您有兴趣构建自己的具有 Cortex-A 系列 multilib 支持的 gcc,只需对任何 arm*-*-* 使用 --with-multilib-list=aprofile 配置选项code> 没有任何补丁的目标 ( at list with gcc-6.2.0 )。

关于gcc - 如何使用单个 GCC(交叉)编译器(交叉)编译为 ARM 硬浮点和软浮点 (softfp)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561929/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com