C++ 树莓皮臂浮动ABI兼容性

C++ 树莓皮臂浮动ABI兼容性,c++,gcc,g++,arm,raspberry-pi,C++,Gcc,G++,Arm,Raspberry Pi,我目前正在我的Ubuntu机器上为Raspberry Pi执行一些交叉编译测试。我目前的理解是Raspberry Pi支持硬件浮点,默认的Raspbian OS映像是用硬件浮点(armhf)构建的。对吗 如果我使用“arm linux gnueabi”工具链构建我的应用程序(不指定任何arm标志),那么我的应用程序将使用软浮点ABI。对吗 在这种情况下,我的所有依赖项也必须使用相同的ABI才能正确链接。对吗 如果我的应用程序使用软浮点ABI,那么我的应用程序肯定链接到一个软浮点ABI共享标准库。

我目前正在我的Ubuntu机器上为Raspberry Pi执行一些交叉编译测试。我目前的理解是Raspberry Pi支持硬件浮点,默认的Raspbian OS映像是用硬件浮点(armhf)构建的。对吗

如果我使用“arm linux gnueabi”工具链构建我的应用程序(不指定任何arm标志),那么我的应用程序将使用软浮点ABI。对吗

在这种情况下,我的所有依赖项也必须使用相同的ABI才能正确链接。对吗

如果我的应用程序使用软浮点ABI,那么我的应用程序肯定链接到一个软浮点ABI共享标准库。当我在我的Raspberry Pi上运行我的应用程序时,一切都正常工作。如果Raspbian使用硬浮点ABI(我猜共享标准库也使用硬浮点ABI),这怎么可能呢

仅供参考:我的默认arm linux gnueabi配置为:

--with-float=soft
--with-arch=armv5
我正在这样编译我的应用程序:

arm-linux-gnueabi-g++ test.cpp -o test
我的程序包括浮点计算:

double test = (123.456 + 789.123) * 1.23;
printf("%f\n", test); // prints: 1122.472170
printf("%f\n", std::floor(test)); // prints: 1122.000000

你所有的肯定都是正确的,我只想对拉斯宾的
armhf
增加一点精确性

Debian的
armhf
ARMLinuxGnueAbiHF
)目标是ARMv7t硬浮动。由于Raspbian是基于Debian的,所以您可能会期望相同的结果,但是Raspbian的
armhf
targetsARMv6硬浮动(这正是Raspbian存在的首要原因:在Debian的
armel
--ARMv4t软浮点--armhf体系结构之间找到一个中间地带,以正确利用Raspberry的CPU)

因此,Raspbian谈论
armhf
有点危险,特别是因为许多人会使用Debian(或Ubuntu等衍生工具)作为主机系统,因此可能会混淆两者。如果你问我,Raspbian的人在保留相同的体系结构名称时犯了一个错误,应该是
arm6hf

当我在我的Raspberry Pi上运行我的应用程序时,一切都按预期运行。如果Raspbian使用硬浮点ABI(我猜共享标准库也使用硬浮点ABI),这怎么可能呢

据我所知,
arm-linux-gnueabi
arm-linux-gnueabihf
之间的唯一区别是涉及浮点的调用约定(前者使用整数寄存器传递它们,后者使用浮点寄存器)

如果您从未在测试程序中使用浮点ABI(我的意思是,您不会通过CPU/FPU寄存器将浮点传递到外部库——但是您可以在内部完美地进行浮点计算——使用软浮点——例如,在实际“使用”之前将结果强制转换为
int
它在第三方库中),那么你永远不会达到ABI的差异和所有作品

关于您给出的使用浮点的示例,我相信它们属于我刚才描述的类别:您从不使用硬浮点ABI

  • 很可能
    std::floor
    是内联的(确保这一点的最佳方法是查看程序集转储)
  • printf
    使用可变参数,因此实际上您使用的是传统的C调用约定,即参数在堆栈上传递,而不是通过CPU/FPU寄存器传递


无论如何,您应该避开当前的
arm linux gnueabi
工具链,使用专门为Raspbian设计的工具链。只需在web上搜索“Raspberry Pi交叉编译器”。这样您就不会感到麻烦了。

您的程序中使用浮点吗?可能您的应用程序根本不使用浮点吗?我已经尝试过了“打破它”。请参阅上面的编辑。尝试其他方法,然后使用诸如sqrt或power之类的printf。raspberry pi中的ARM11是armv6,我相信不是armv5