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.18そしてGNU make 3.81移動するGCC 6.3.0。 Ubuntuディストリビューションに付属のgcc 6.3.0とバージョン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

その中にはzlibの場所である${insdir}インストールディレクトリがあります${zlibdir}。他のスイッチは標準に従います。インストールマニュアル

構成ステップがスムーズに進行しました。次のエラーは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ウェブサイトgcc次のスイッチを使用して設定できるようです。

--enable-version-specific-runtime-libs

libdir/gccランタイムライブラリを通常の場所ではなくコンパイラ固有のサブディレクトリ()にインストールする必要があることを指定します。また、以下を使用して上書きしない限り、インクルードlibstdc++ファイルがインストールされます。libdir--with-gxx-include-dir=dirnameこのオプションを使用することは、複数のバージョンのGCCを並列に使用したい場合に特に便利です。現在、この機能libgfortranlibstdc++、およびでサポートされていますlibobjc

  • これが正しい方向を指していますか?
  • このスイッチを使用しない場合は、gccソースと共に配布されたlibstdc ++インクルードファイルをどこで見つける必要がありますか?

答え1

通常、libstdc++(パッケージ名の一部としてバージョンや「-dev」または「-devel」を含む)などの開発パッケージの一部であるC ++ヘッダファイルを探します。

たとえば、Debian (Ubuntu はほとんどのパッケージをインポート) の Debian 7 システムに、次のファイルを含む "libstdc++6-4.6-dev" があります。

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

これCヘッダファイルに.hサフィックスC++一般的にそうではありません(一部のシステムでは見ることができますが、.hh)。

追加のコンパイラを構成するときに使用する設定(ログ参照...)を使用すると、ライブラリを見つけることができる場所がわかります。最新のコンパイラと互換性があるように独自のlibstdc ++をビルドする必要があるかもしれません。繰り返しますが、--prefixコンパイラとライブラリが連携するには、設定時にオプションを設定する必要があります。

次の質問を解決するには:コンパイラがで探している場合は、変数を変更して追加することで/usr/localこの問題を解決できます(ライブラリパスも考慮する必要があります)。 libstdc++ パッケージで使用されるパス名を表示するには、次のようにします。CPPFLAGS/usr/include/usr/include/c++/4.8LDFLAGS

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

答え2

問題を解決する1つの方法があります。ありがとうトーマスディキの答えそれは私が正しい方向に導いたからです。

質問

問題は、カスタムインストールコンパイラgcc 6.3.0がlibstdc++Ubuntuディストリビューションに含まれる一連のファイルを見つけることができないことです。/usr/include/

理由

インストールされると、gcc 6.3.0の独自の設定ファイルは、ターゲットディレクトリ内のローカル(以前にインストールされていた)ヘッダファイルを見つけるためのデフォルト仕様に自動的に従います。これのデフォルト値はです/usr/local/include/https://gcc.gnu.org/install/configure.htmlもっと学ぶ。

固定する

再インストールされたコンパイラは、./configure --with-local-prefix=/usrUbuntuが保存した必須ファイルを取得できる新しいgccを作成しました。CPPFLAGS質問に表示される内容を調整する必要はありません。ただし、--with-local-prefix=/usrこの設定はお勧めできません(参照:https://unix.stackexchange.com/a/348868/132913)これが回避策です。

確認する

この戦略の経験的テストは、makeHDF 1.8.18がかつて困難を経験した部分で発展したことです。すべてのテストがmake check成功しました。

代替

私が見つけた(まだ探索された)新しいライブラリをインストールするもう1つの方法は、gcc(switch)のカスタムインストールのためのものlibstdc++です。--enable-version-specific-runtime-libs私は手がかりを見つけるために上記の質問フレームにこの可能性を設定しました。これはおそらくより強力なソリューションです。このスレッドは現在開いています。あなたの貢献/修正に感謝します。

関連情報