首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用一个GCC (交叉)编译器将ARM硬浮点(softfp)编译成软浮点(Softfp)?

如何用一个GCC (交叉)编译器将ARM硬浮点(softfp)编译成软浮点(Softfp)?
EN

Stack Overflow用户
提问于 2014-03-21 22:45:24
回答 2查看 18K关注 0票数 6

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

我的编译器默认使用硬浮点型,但它同时支持我需要的两种架构:

代码语言:javascript
复制
$ arm-linux-gnueabihf-gcc -print-multi-lib
.;
arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft
$

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

代码语言:javascript
复制
$ arm-linux-gnueabihf-g++ -Wall -o hello_world_armhf hello_world.cpp

它成功了,没有任何错误。

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

代码语言:javascript
复制
$ arm-linux-gnueabihf-g++ -marm -march=armv4t -mfloat-abi=soft -Wall -o hello_world hello_world.cpp

它再次编译时没有错误(顺便说一句,我如何测试结果代码是硬浮点还是软浮点?)

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

代码语言:javascript
复制
$ 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,但问题是二进制文件的一些部分是软的,而另一些是硬浮点的。我有一个单独的C++文件要编译...

我错过了哪个(S)参数才能使用-march=armv7-a -mthumb interwork -mfloat-abi=softfp -mfpu=neon进行编译?

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

谢谢!

对于记录,hello_world.cpp包含以下内容:

代码语言:javascript
复制
#include <iostream>

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

回答 2

Stack Overflow用户

发布于 2016-11-04 07:44:08

您需要另一个具有相应的multilib支持的编译器。您可以使用next命令检查multilib支持情况。

代码语言:javascript
复制
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

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-05-29 22:24:59

根据Linaro FAQ,如果你的编译器打印arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft,那么你只能使用-march=armv4t。如果你想使用-march=armv7-a,你需要自己构建编译器。

下面的链接可以帮助你构建自己的GCC ARM Builds

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22561929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档