gcc コンパイルは、"致命的なエラー: 文字列: 対応するファイルまたはディレクトリがない #include" で終了します。」

gcc コンパイルは、

私の状況。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')

おすすめ記事