C++ 无法在Solaris 10上使用GCC 5.5包含cmath

C++ 无法在Solaris 10上使用GCC 5.5包含cmath,c++,gcc,solaris,solaris-10,C++,Gcc,Solaris,Solaris 10,我正在尝试使用gcc 5.5.0在Solaris 10 sparc机器上运行以下测试程序 #include <iostream> #include <cmath> int main() { std::cout << "exp2(4) = " << std::exp2(4) << '\n' << "exp2(0.5) = " << std::exp2(0.5) <<

我正在尝试使用gcc 5.5.0在Solaris 10 sparc机器上运行以下测试程序

#include <iostream>
#include <cmath>

int main()
{
    std::cout << "exp2(4) = " << std::exp2(4) << '\n'
              << "exp2(0.5) = " << std::exp2(0.5) << '\n'
              << "exp2(-4) = " << std::exp2(-4) << '\n';
    return 0;
}
在使用以下命令编译时

g++ -std=c++11 -Wall test.cpp
我得到以下错误

在/opt/csw/include/c++/5.5.0/cmath:44:0中包含的文件中,
来自测试。cpp:2:
/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0/include fixed/math.h:52:12:错误:“std::float\u t”尚未声明
使用std::float\u t;
^
/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0/include fixed/math.h:53:12:错误:“std::double\t”尚未声明
使用std::double\t;
^
/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0/include fixed/math.h:55:12:错误:尚未声明“std::fpclassify”
使用std::fp进行分类;
^
/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0/include fixed/math.h:56:12:错误:尚未声明“std::isfinite”
使用std::isfinite;
我按照给出的说明安装了GCC 5.5。

我发现了相同的错误。 在标题中/opt/csw/lib/gcc/sparc-sun-solaris2.10/5.5.0/include fixed/math.h 我换了一行:

#if __cplusplus >= 201103L
using std::float_t;

2019年4月24日更新——@Andrew Henle想让你知道

If you are attempting to compile C++11 on an unpatched, unupdated 
installation of Solaris 10, and are presenting this as a "fix", 
you do not understand what you are doing. 
@Andrew Henle说,有一个“solaris”修补程序修复了csw/include/c++/…/cmath和csw/lib/gcc/…/math.h,但该修补程序如何影响csw头文件的安装尚不清楚,也没有具体说明

2019年4月26日更新

我使用csw gcc安装并使用以下软件包构建了一个新的binutils和gcc-5.5.0:

binutils-2.27.tar.bz2
cloog-0.18.1.tar.gz
gcc-5.5.0.tar.gz
gmp-5.1.2.tar.xz
mpc-1.0.1.tar.gz
mpfr-3.1.2.tar.xz
首先构建binutils

../configure --prefix=$TARGET_PATH/sx64
make
make install
我对gcc使用了以下配置:

../configure --prefix=$TARGET_PATH/sx64 --enable-languages=c,c++ --enable-threads=posix --enable-version-specific-runtime-libs --disable-libsanitizer --with-as=$TARGET_PATH/sx64/bin/as --with-ld=$TARGET_PATH/sx64/bin/ld --with-gnu-ld --with-gnu-as
make bootstrap
make install
您必须使用--with-as和--with-ld使gcc使用构建的binutils版本,而不是损坏的系统版本


使用此编译器,我在编译有效的c++-11代码时没有遇到任何问题。

Solaris 10比c++11早了好几年——早期版本与Windows XP同步。Solaris 10的确切版本是什么?它是否与最新的补丁和更新保持同步?如果完全删除
-std=c++11
,您是否有问题?如果您用类似于
-std=c++98
的东西替换它,会发生什么?或者GNU特定C++语言中的任何一个?@安德烈斯勒不管,GCC 5.5应该与它所需要的一切一起工作,或者根本不需要。对我来说,这似乎更多的是一个配置问题,或者可能是GCC 5.5的Solaris支持的一个bug。也就是说,这将是一个GCC问题,而不是Solaris问题。@LightnessRacesinOrbit很可能是Solaris版本的一个问题,因为现在支持C++11还为时过早。OpenCSW gcc5软件包不提供
iso/math_c99.h
的版本,但在Solaris 11上,C++11的
std
命名空间下完成了
typedef float_t
。然而,位于的Illumos源代码没有任何
#if#cplusplus>201103L名称空间std{#endif
,这意味着在OpenSolaris从Solaris 10派生出来之后,C++11支持被添加到Solaris中。OP的Solaris 10可能早于C++11支持。(续),甚至,这意味着它可能缺少C++11支持,尽管Oracle修补程序可能已经解决了这一问题。通常,我同意您的看法,这完全是一个GCC问题,但在这种情况下,问题的出现可能很大程度上取决于Solaris 10 OpenCSW支持的版本。@AndrewHenle添加了Solaris版本详情ls.
#若0&&uu cplusplus>=201103L
破坏了C++11的支持。若编译器支持C++11,那个么它可能不会抱怨std::float#t等。我认为包含这个“固定的”math.h是有问题的,因为编译器不接受它。问题中的编译器是GCC 5.5.0,它支持C++11。问题是底层操作系统提供的数学头似乎不支持C++11,可能是因为所讨论的Solaris 10版本早于C++11的存在,而且还没有进行修补。请注意,当我四个月前提到Solaris 10修补程序119966-02时,关于此问题的所有活动都停止了。当您安装gcc编译器时csw暂停编译代码“std::float”,请告知我,因为它不接受该代码。编译器错误==不编译。如果您试图在未打补丁、未更新的Solaris 10安装上编译C++11,并将其表示为“修复”,则您不明白自己在做什么。
../configure --prefix=$TARGET_PATH/sx64
make
make install
../configure --prefix=$TARGET_PATH/sx64 --enable-languages=c,c++ --enable-threads=posix --enable-version-specific-runtime-libs --disable-libsanitizer --with-as=$TARGET_PATH/sx64/bin/as --with-ld=$TARGET_PATH/sx64/bin/ld --with-gnu-ld --with-gnu-as
make bootstrap
make install