我正在按照this question中的建议尝试在gcc下启用软件浮点,但遇到了障碍:
-msoft-float标志导致:
/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘long double std::stold(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2857:47: error: x87 register return with x87 disabled
stold(const string& __str, size_t* __idx = 0)
^
和-mno-sse原因:
/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘float std::stof(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2849:46: error: SSE register return with SSE disabled
stof(const string& __str, size_t* __idx = 0)
^
有一个couple of questions提到了此错误,但是与内核编程无关,这没有帮助。
basic_string中发生的所有事情都是函数返回浮点数或双精度数。为什么这会导致编译失败?
更重要的是,我该怎么办?
我发现在两个不同平台上C ++应用程序的行为有所不同:
在两台计算机上本地编译的代码可在另一台计算机上运行,但 对于一种测试,其行为取决于代码在哪台计算机上运行。
说明 在计算机A上编译的可执行文件在复制以在Machnie B上运行时,其行为类似于在计算机B上编译的可执行文件,反之亦然。
它可以是未初始化的变量或许多其他东西,但是 我怀疑原因可能是非便携式使用浮点数。 也许一台机器对浮点组件的解释与另一台机器不同? 我想检验我的假设。 我以为如果可以强制程序使用(最好是严格的IEE 754)软件浮点数,它可能会确认或排除该问题。 它不是我的代码,我也不想完全重写它来测试它。重新编译是可以的。
与此相关,我问了一个单独的问题how-to-detect-differences-in-floating-point-behaviour-across-platforms,从另一侧解决了这个问题。
答案 0 :(得分:2)
“为什么这会导致编译失败?”
因为定义了相关的ABI(x87 / x64),以便在硬件浮点寄存器中返回float
值。您显然需要硬件浮点才能拥有该寄存器。
“更重要的是,我该怎么办?”
不多。与x87 / x64不同,ARM确实具有软FP ABI,因此-msoft-float
确实可以在其中工作,这就是GCC仍然具有软FP的主要原因。