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

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

我的情况。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

我正在尝试安装HDF5 1.8.18GNU make 3.81调用海湾合作委员会6.3.0。我已经成功安装了 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

其中${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

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

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

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

更新的问题

根据下面的有用评论和 Thomas Dickey 的回答,似乎一个有前途的途径是安装libstdc++和的匹配版本gcc。我已经在周围搜索过海湾合作委员会网站似乎可以gcc使用以下开关进行配置

--enable-version-specific-runtime-libs

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

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

答案1

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

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

/usr/include/c++/4.6/string

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

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

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

dpkg -L $(dpkg -l | awk '{print $2}' |grep -E 'libstdc++.*dev')

答案2

以下是解决问题的一种途径。我很感激托马斯·迪基的回答因为让我走上了正确的方向。

问题

问题是自定义安装的编译器 gcc 6.3.0 无法找到Ubuntu 发行版中libstdc++包含的系列文件。/usr/include/

原因

在安装时,gcc 6.3.0 本身的配置文件默默地遵循默认规范,即在目标目录中查找本地(以前安装的)头文件。这个默认值是/usr/local/include/.看https://gcc.gnu.org/install/configure.html了解详情。

使固定

重新安装的编译器./configure --with-local-prefix=/usr创建了一个新的 gcc,它能够在 Ubuntu 放置的位置获取所需的文件。CPPFLAGS对于问题中显示的内容,不需要进一步调整。但是,--with-local-prefix=/usr不鼓励进行该设置(请参阅https://unix.stackexchange.com/a/348868/132913),所以这是一个解决方法。

查看

对这一策略的实证检验是,makeHDF 1.8.18 的进展是在它曾经陷入困境的地方。中的所有测试make check均已成功通过。

备择方案

我已经注意到(尚未)探索了安装新库的另一种途径,libstdc++该库专门用于 gcc 的自定义安装(开关--enable-version-specific-runtime-libs)。我在上面的问题框架中提出了这种可能性,以寻找线索。这很可能是一个更强大的解决方案。该线程暂时保持开放状态。感谢您的贡献/编辑

相关内容