Compiling

gcc 編譯以“致命錯誤:字元串:沒有這樣的文件或目錄#include <string>”而終止

  • March 3, 2017

我的情況。uname -aLinux 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

where${insdir}是安裝目錄,${zlibdir}是 zlib 所在的位置,其他開關是根據安裝指南的標準

配置步驟進展順利。製作步驟失敗並出現錯誤:

make[2]: Entering directory `&lt;the source directory&gt;/hdf5-1.8.18/c++/src'
CXX      H5Exception.lo
H5Exception.cpp:16:18: fatal error: string: No such file or directory
#include &lt;string&gt;
               ^
compilation terminated

如果我理解正確,則缺少一些標頭檔,並且是基本性質的。

  • 我應該從哪裡得到它?
  • 環境變數的名稱和值是否有任何缺陷?

StackExchange 包含有關此錯誤的大量文章,但它們似乎主要與編碼練習有關。我的目標不是編輯程式碼,而是使用我的 vanilla gcc 6.3.0 成功編譯原始碼。

更新的問題

根據下面有用的評論和 Thomas Dickey 的回答,似乎有希望的途徑是安裝libstdc++和的匹配版本gcc。我在GCC 網站上進行了搜尋,似乎可以使用以下開關配置 gcc

–enable-version-specific-runtime-libs

指定執行時庫應安裝在編譯器特定的子目錄 ( libdir /gcc) 中,而不是通常的位置。此外,除非您使用 –with-gxx-include-dir= *dirname否決它,否則 libstdc++ 的包含文件將安裝到libdir*中。**如果您打算並行使用多個版本的 GCC,則使用此選項特別有用。目前,“libgfortran”、“ libstdc++ ”和“libobjc”都支持此功能。

  • 這是否指向正確的方向?
  • 如果不使用開關,我應該在哪裡找到與 gcc 源一起分發的 libstdc++ 包含文件?

那是在尋找 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在配置時設置選項,以便編譯器和庫一起工作。

解決後續問題:如果您的編譯器正在查找/usr/local,那麼您可以通過修改CPPFLAGS變數、添加/usr/include(可能還有/usr/include/c++/4.8等)來解決此問題,儘管還LDFLAGS需要考慮庫路徑)。要查看 libstdc++ 包使用的路徑名,請使用

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

引用自:https://unix.stackexchange.com/questions/346133