私の状況。 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。この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」でサポートされています。
これは、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')
以下は、解決策への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
)について(まだ)調査したことに注意しました。手掛かりを求めて、上の質問フレームでこの可能性を上げました。それはおそらくより堅牢なソリューションかもしれません。スレッドは今のところ開いたままです。貢献/編集してくれてありがとう