利用-mfloat-abi=hard和-mfpu=vfp/neon Codesourcery Lite 2013.05-24

5

为了使用vfp或neon,我在我的交叉编译中添加了-mfpu=vfp和-mfloat-abi=hard选项。该程序是一个非常简单的hellofloat.cpp,然后在Sourcery CodeBench Lite 2013.05-24中无法编译。

#include <string>
#include <iostream>
using namespace std;
int main()
{
    double val=1.04;
    cout << "Hello Float: " << val  << endl;
}

编译指令:

arm-none-linux-gnueabi-g++ -o armhf-main main.cpp  -march=armv7-a  -mfloat-abi=hard -mfpu=neon

我很困惑,因为Codesorcery应该支持armhf编译,但是我的代码出现了错误: 错误:
In file included from /home/user/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/include/features.h:399:0,
                 from /home/user/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.3/../../../../arm-none-linux-gnueabi/include/c++/4.7.3/arm-none-linux-gnueabi/bits/os_defines.h:40,
                 from /home/user/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.3/../../../../arm-none-linux-gnueabi/include/c++/4.7.3/arm-none-linux-gnueabi/bits/c++config.h:414,
                 from /home/user/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.3/../../../../arm-none-linux-gnueabi/include/c++/4.7.3/string:40,
                 from main.cpp:1:
/home/user/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/include/gnu/stubs.h:10:29: fatal error: gnu/stubs-hard.h: No such file or directory
compilation terminated.

编译器

arm-none-linux-gnueabi-g++ -v
Using built-in specs.
COLLECT_GCC=arm-none-linux-gnueabi-g++
COLLECT_LTO_WRAPPER=/home/user/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../libexec/gcc/arm-none-linux-gnueabi/4.7.3/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: /scratch/jbrown/2013.05-arm-linux-release/src/gcc-4.7-2013.05/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} -D__CS_SOURCERYGXX_MAJ__=2013 -D__CS_SOURCERYGXX_MIN__=5 -D__CS_SOURCERYGXX_REV__=24 %{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2013.05-24' --with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/jbrown/2013.05-arm-linux-release/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/jbrown/2013.05-arm-linux-release/obj/pkg-2013.05-24-arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpfr=/scratch/jbrown/2013.05-arm-linux-release/obj/pkg-2013.05-24-arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpc=/scratch/jbrown/2013.05-arm-linux-release/obj/pkg-2013.05-24-arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-ppl=/scratch/jbrown/2013.05-arm-linux-release/obj/pkg-2013.05-24-arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/jbrown/2013.05-arm-linux-release/obj/pkg-2013.05-24-arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-libelf=/scratch/jbrown/2013.05-arm-linux-release/obj/pkg-2013.05-24-arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --disable-libgomp --disable-libitm --enable-poison-system-directories --with-build-time-tools=/scratch/jbrown/2013.05-arm-linux-release/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/jbrown/2013.05-arm-linux-release/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.7.3 (Sourcery CodeBench Lite 2013.05-24) 

2
你能使用 softfp 编译或者其他简单的测试应用程序吗?看起来像是工具链问题。 - auselen
1
尝试运行 arm-none-linux-gnueabi-g++ -v 命令并将输出结果发布。 - artless noise
@Marko,我该如何指定我想要链接的内容? - eactor
基本上,编译器可以轻松地配置为仅支持其中一种浮点类型。如果它同时支持软件和硬件浮点 ABI,则是多库 GCC。通常,编译器名称反映了这一点,但只有编译器构建者指定前缀,因此只有“-v”输出才能确定。多库将查看编译器选项并选择正确的库。然而,这个问题是在编译时出现的,可能是由于缺少头文件。请参见交叉编译(相反)。 - artless noise
@JoeKul:我没有从Marko的评论中得到这个。很高兴你能明白。另外,实际的错误是缺少一个头文件,我们还没有涉及到库。所以显然这个编译器是无望的。 - artless noise
显示剩余5条评论
1个回答

4
Sourcery CodeBench Lite工具链不支持armhf,学术版和个人版也不支持。您需要购买标准版或专业版才能获得该功能。另外,我相信Ubuntu的交叉编译器包支持您需要的配置(实际上只有这种配置)。如果您没有使用Ubuntu,则预构建的Linaro工具链应该正是您所需的。(Ubuntu交叉编译器包/曾经也是由Linaro人员构建的,尽管使用了Debian/Ubuntu特定的deb构建系统。)

1
你也可以自己构建。请参考crosstool-ng,它是一组用于构建交叉编译器的脚本集合。这比自己动手稍微容易一些,并且一旦您了解其工作原理,通常允许创建更适合您硬件的编译器。Linaro也是一个不错的建议。UbuntuLinaro都使用crosstool-ng脚本。 - artless noise
@artlessnoise:确实,我忘记了整个世界并不都使用Ubuntu。Linaro工具完全相同,但更广泛可安装。 - ams
1
很遗憾ARM停止赞助CodeSourcery工具,但有了Linaro在身边,这也不难理解。 - ams
你知道Xilinx编译器是否支持armhf吗?他们调整了Codesorcery编译器并将其添加到ISE套件中作为arm-xilinx-linux-gnueabi。 - eactor
我相信Xilinx工具链使用softfp ABI(即它们不是armhf),但我不能保证。 - ams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接