私の状況。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を並列に使用したい場合に特に便利です。現在、この機能libgfortran
はlibstdc++
、およびでサポートされています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.8
LDFLAGS
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=/usr
Ubuntuが保存した必須ファイルを取得できる新しいgccを作成しました。CPPFLAGS
質問に表示される内容を調整する必要はありません。ただし、--with-local-prefix=/usr
この設定はお勧めできません(参照:https://unix.stackexchange.com/a/348868/132913)これが回避策です。
確認する
この戦略の経験的テストは、make
HDF 1.8.18がかつて困難を経験した部分で発展したことです。すべてのテストがmake check
成功しました。
代替
私が見つけた(まだ探索された)新しいライブラリをインストールするもう1つの方法は、gcc(switch)のカスタムインストールのためのものlibstdc++
です。--enable-version-specific-runtime-libs
私は手がかりを見つけるために上記の質問フレームにこの可能性を設定しました。これはおそらくより強力なソリューションです。このスレッドは現在開いています。あなたの貢献/修正に感謝します。