在gcc的指导下,我正在尝试启用this question中的软件浮点,但我遇到了一个障碍:
-msoft-浮动旗导致:
/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的原因:
/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++应用程序在两个不同平台上的行为差异:
在这两台机器上本地编译的代码在另一台机器上运行,但是对于一种测试,其行为取决于在哪台机器上运行代码。
Clarification --在机器A上编译的可执行文件,在复制到在machnie B上运行时,就像在机器B上编译的可执行文件一样,而visa则相反。
它可能是一个未初始化的变量或许多其他东西,但我怀疑原因可能是浮点的不可移植性的使用。也许一台机器对浮点程序集的解释不同于另一台机器?我想验证我的假设。我想,如果我可以强制程序使用(理想的严格的IEE 754)软件浮点,它可能会确认或排除这一点。这不是我的代码,我也不想完全重写它来测试它。不过,重新编译是可以的。
关于这一点,我已经提出了一个单独的问题,how-to-detect-differences-in-floating-point-behaviour-across-platforms从另一方处理这个问题。
发布于 2019-03-22 15:25:46
“为什么这会导致编译失败?”
因为相关的ABI (x87/x64)被定义为在硬件浮动寄存器中返回float值。显然,您需要硬件浮点才能拥有该寄存器。
“更重要的是,我能做些什么?”
不是很多。与x87/x64不同,ARM确实有一个软FP ABI,所以-msoft-float也在那里工作,这也是GCC仍然拥有软FP的主要原因。
https://stackoverflow.com/questions/55225910
复制相似问题