gcc 编译终止并显示“致命错误:字符串:没有这样的文件或目录#include <string>”

Xav*_*uvw 5 compiling gcc configure

我的情况。uname -a给出Linux computer2 4.4.0-62-generic #83~14.04.1-Ubuntu SMP Wed Jan 18 18:10:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

我正在尝试使用GNU make 3.81调用gcc 6.3.0安装HDF5 1.8.18。我已经成功安装了 gcc 6.3.0 以及 Ubuntu 发行版附带的版本 4.8.4。

我的 gcc 6.3.0 位于/opt/gcc/6_3_0/. 我使用以下脚本来配置和传递非标准目录中的命令、库和标头:

export FC='/opt/gcc/6_3_0/bin/gfortran-6.3.0'   # probably unnecessary
export CC='/opt/gcc/6_3_0/bin/gcc-6.3.0'  
export CXX='/opt/gcc/6_3_0/bin/g++-6.3.0' 
export CPP='/opt/gcc/6_3_0/bin/cpp-6.3.0'
export LDFLAGS='-L/opt/gcc/6_3_0/lib -L/opt/gcc/6_3_0/lib64' 
export CPPFLAGS='-I/opt/gcc/6_3_0/include -I/opt/gcc/6_3_0/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include'

./configure \
--prefix=${insdir} \
--with-zlib=${zlibdir}/include,${zlibdir}/lib \
--enable-fortran \
--enable-cxx
Run Code Online (Sandbox Code Playgroud)

其中${insdir}是安装目录,${zlibdir}是 zlib 所在的位置,其他开关是根据安装指南的标准

配置步骤进展顺利。make 步骤失败并出现错误:

make[2]: Entering directory `<the source directory>/hdf5-1.8.18/c++/src'
CXX      H5Exception.lo
H5Exception.cpp:16:18: fatal error: string: No such file or directory
#include <string>
                ^
compilation terminated
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,则缺少一些头文件,并且具有基本性质。

  • 我应该从哪里获取它?
  • 环境变量的名称和值是否有缺陷?

StackExchange 包含大量有关此错误的帖子,但它们似乎主要与编码练习相关。我的目标不是编辑代码,而是使用我的普通 gcc 6.3.0 成功编译源代码。

更新的问题

根据下面的有用评论和 Thomas Dickey 的回答,似乎一个有前途的途径是安装libstdc++和的匹配版本gcc我在GCC 网站上搜索了一下,似乎可以gcc使用以下开关进行配置

--enable-version-specific-runtime-libs

指定运行时库应安装在编译器特定的子目录 ( libdir/gcc) 中,而不是通常的位置。此外,除非您使用 否决了它,否则libstdc++的包含文件将被安装到其中。libdir--with-gxx-include-dir=dirname如果您打算并行使用多个版本的 GCC,则使用此选项特别有用。libgfortran目前,libstdc++、 和 均支持此功能libobjc

  • 这是否指向正确的方向?
  • 如果不使用此开关,我应该在哪里找到与 gcc 源一起分发的 libstdc++ 包含文件?

Tho*_*key 3

这是寻找 C++ 头文件,通常是开发包的一部分,例如 libstdc++(带有版本和“-dev”或“-devel”作为包名称的一部分)。

例如,在 Debian 中(Ubuntu 获得大部分软件包),我的 Debian 7 机器上有一个“libstdc++6-4.6-dev”,其中包含以下文件:

/usr/include/c++/4.6/string
Run Code Online (Sandbox Code Playgroud)

C文件有一个.h后缀;C++通常不会(尽管在某些系统上您可能会看到.hh)。

当您配置附加编译器时,它使用的设置(请参阅您的日志...)告诉它在哪里可以找到库。您可能必须构建自己的 libstdc++ 以与较新的编译器兼容。同样,您必须--prefix在配置时设置选项,以便编译器和库一起工作。

解决后续问题:如果您的编译器正在查找 in ,那么您可以通过修改变量、添加(可能还有等)/usr/local来解决此问题,尽管还需要考虑库路径)。要查看 libstdc++ 包使用的路径名,请使用CPPFLAGS/usr/include/usr/include/c++/4.8LDFLAGS

/usr/include/c++/4.6/string
Run Code Online (Sandbox Code Playgroud)

  • @XavierStuvw `string.h` 将是一个 C 头文件;您的问题似乎与 C++ 头文件“string”有关 (2认同)