「基本」C ++を含む基本パスを取得する慣用的な方法は何ですか?

「基本」C ++を含む基本パスを取得する慣用的な方法は何ですか?

何らかの理由で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
...

おすすめ記事