使用g ++与-mlong-double-128时对std :: ostream :: operator<<(__ float128)的未定义引用

时间:2016-08-12 10:40:59

标签: c++ gcc g++ precision

我在名为test.cc的文件中有以下小C ++代码:

#include <iostream>
int main() {
  long double x = 3.3;
  std::cout << x << std::endl;
}

以正常方式编译(只需g ++ test.cc)可以正常工作。

但是,尝试使用-mlong-double-128选项时会出现链接问题:

$ g++ -mlong-double-128 test.cc 
/tmp/cccKog5D.o: In function `main':
test.cc:(.text+0x1f): undefined reference to `std::ostream::operator<<(__float128)'
collect2: error: ld returned 1 exit status

我尝试添加-lquadmath,但问题仍然存在。

我尝试使用g ++版本5.4.0和6.1.0,两者的行为相同。

使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;运营商,但我真的想让它在没有这样做的情况下发挥作用。 (背景是我有一个更大的研究代码,我希望能够使用-mlong-double-128进行编译以获得更高的精度,但由于这个问题它会失败。)

关于如何解决这个问题的任何想法?

编辑:

现在我发现使用@Niall建议的-mlong-double-128重新编译libstdc ++库解决了链接问题。

我下载了libstdc ++源代码(gcc-6.1.0.tar.gz包的一部分)并按如下方式配置:

../configure --enable-cxx-flags=-mlong-double-128 --prefix=/home/elias/slask/inst --disable-multilib

然后,使用生成的libstdc ++。库文件,我可以构建我的test.cc程序而不会出现任何链接错误:

g++ -mlong-double-128 test.cc /home/elias/slask/inst/lib64/libstdc++.a

然而,当运行生成的可执行文件时,无论如何都会给出错误的结果,它会打印“nan”而不是3.3。看起来它正在调用一些glibc例程来实际转换为字符串,这不起作用,因为glibc没有使用-mlong-double-128编译。我尝试用-mlong-double-128重新编译glibc,但这似乎不起作用。

编辑2:

我在GCC bugzilla页面中介绍了这个相关问题:

Bug 43622 - Incomplete C++ library support for __float128

从评论来看,似乎我正在尝试做的可能不会立即开始工作,但可能在未来版本中有用,至少这是一个已知问题。

0 个答案:

没有答案