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