何らかの理由でC ++インクルードルート/usr/include/c++/10
(GCC-10のlibstdc ++など)が必要なユーティリティのコマンドラインを作成しています。私の質問は:私のシステムでそのパスが何であるかをどうやって確認しますか?それともこれを行うための慣用的な方法は何ですか?
明らかにusingをオーバーライドすることは可能ですCPLUS_INCLUDE_PATH
が、この場合は簡単です。複数のC ++コンパイラがインストールされている場合(複数のバージョンのGCCを含む)、どうすればよいですか?/usr/include
バージョン番号を「手動で」並べ替える他の方法はありますか?
ベストアンサー1
良い質問。
私のコンピュータでは、次のようになります。
$ find /usr/include -name string
/usr/include/c++/8/debug/string
/usr/include/c++/8/experimental/string
/usr/include/c++/8/string
/usr/include/c++/9/debug/string
/usr/include/c++/9/experimental/string
/usr/include/c++/9/string
/usr/include/c++/10/debug/string
/usr/include/c++/10/experimental/string
/usr/include/c++/10/string
/usr/include/c++/11/debug/string
/usr/include/c++/11/experimental/string
/usr/include/c++/11/string
/usr/include/c++/12/debug/string
/usr/include/c++/12/experimental/string
/usr/include/c++/12/string
どのプログラムが使用されているかを知るために、gccを使用して空のプログラムを処理し、対応する検索パスを印刷できます。
$ g++ -E -xc++ - -v < /dev/null
...
#include <...> search starts here:
/usr/include/c++/12
/usr/include/x86_64-linux-gnu/c++/12
/usr/include/c++/12/backward
/usr/lib/gcc/x86_64-linux-gnu/12/include
/usr/include/x86_64-linux-gnu
/usr/include
...
ロゴの説明:
-E
:前処理のみ可能で、コンパイル、アセンブル、リンクしません。-xc++
:言語指定(C++)-
:ファイルの代わりに標準入力から入力を取得します。-v
:コンパイラによって呼び出されたプログラムを表示します。< /dev/null
:標準入力にnull値を送信します。
元のメイクファイルにまたはを追加し、コンパイルされたCFLAGS
出力CPPFLAGS
を解析することをお勧めします。これはmakefileです-I...
。
例:
$ g++ -E -xc++ - -v -I/tmp < /dev/null
...
#include <...> search starts here:
/tmp <-- NEW because of -I/tmp
/usr/include/c++/12
/usr/include/x86_64-linux-gnu/c++/12
/usr/include/c++/12/backward
/usr/lib/gcc/x86_64-linux-gnu/12/include
/usr/include/x86_64-linux-gnu
/usr/include
...