web-dev-qa-db-ja.com

「致命的なエラー:文字列:そのようなファイルまたはディレクトリはありません#include <string>」でgccコンパイルが終了しました

私の状況。 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を提供します

HDF5 1.8.18GNU make 3.81で起動してインストールしようとしていますgcc 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には このエラーに関する投稿 のホストが含まれていますが、それらは主にコーディング演習に関連しているようです。私の目的は、コードを編集することではなく、Vanilla gcc 6.3.0でソースコードを正常にコンパイルすることです。

更新された質問

役立つコメントと以下のThomas Dickeyの回答に照らして、一致するバージョンのlibstdc++gccをインストールすることが有望な手段であると思われます。 GCC Webサイト で検索したところ、次のスイッチでgccを設定できるようです。

--enable-version-specific-runtime-libs

ランタイムライブラリを通常の場所ではなく、コンパイラ固有のサブディレクトリ(libdir/ gcc)にインストールするように指定します。 さらに、-with-gxx-include-dir =を使用して上書きしない限り、libstdc ++のインクルードファイルはlibdirにインストールされますdirname.このオプションの使用は、複数のバージョンのGCCを並行して使用する場合に特に役立ちます。これは現在、「libgfortran」、「libstdc ++」、および「libobjc」でサポートされています。

  • これは正しい方向を指していますか?
  • スイッチを使用しない場合、gccのソースと一緒に配布されるlibstdc ++のインクルードファイルはどこにあると思いますか?
2
XavierStuvw

これは、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')
2
Thomas Dickey

以下は、解決策への1つの道です。私は正しい方向に導いてくれた Thomas Dickey answer に感謝しています。

問題

問題は、カスタムインストールされたコンパイラ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を使用して再インストールしたコンパイラは、Ubuntuが配置した場所に必要なファイルをフェッチできる新しいgccを作成しました。質問で示された内容に関して、CPPFLAGSをさらに調整する必要はありません。ただし、--with-local-prefix=/usrの設定はお勧めしません( https://unix.stackexchange.com/a/348868/13291 の引用を参照)。これは回避策です。

小切手

この戦略の経験的テストは、HDF 1.8.18のmakeが、取り残されたところまで進行することです。 make checkのすべてのテストに成功しました。

代替案

特に(特に)gccのカスタムインストールを提供する新しいlibstdc++ライブラリをインストールする他の方法(スイッチ--enable-version-specific-runtime-libs)について(まだ)調査したことに注意しました。手掛かりを求めて、上の質問フレームでこの可能性を上げました。それはおそらくより堅牢なソリューションかもしれません。スレッドは今のところ開いたままです。貢献/編集してくれてありがとう

1
XavierStuvw