gcc 編譯以“致命錯誤:字元串:沒有這樣的文件或目錄#include <string>”而終止
我的情況。
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
where
${insdir}
是安裝目錄,${zlibdir}
是 zlib 所在的位置,其他開關是根據安裝指南的標準配置步驟進展順利。製作步驟失敗並出現錯誤:
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 包含有關此錯誤的大量文章,但它們似乎主要與編碼練習有關。我的目標不是編輯程式碼,而是使用我的 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')