我的情况。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.18和GNU 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,则使用此选项特别有用。目前libgfortran
,libstdc++
、 和 均支持此功能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.8
LDFLAGS
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),所以这是一个解决方法。
查看
对这一策略的实证检验是,make
HDF 1.8.18 的进展是在它曾经陷入困境的地方。中的所有测试make check
均已成功通过。
备择方案
我已经注意到(尚未)探索了安装新库的另一种途径,libstdc++
该库专门用于 gcc 的自定义安装(开关--enable-version-specific-runtime-libs
)。我在上面的问题框架中提出了这种可能性,以寻找线索。这很可能是一个更强大的解决方案。该线程暂时保持开放状态。感谢您的贡献/编辑