GCCのデフォルトのインクルードディレクトリは何ですか?


131

非常に単純なソースファイルをgccでコンパイルするとき、stdioやstdlibなどの標準インクルードファイルへのパスを指定する必要はありません。

GCCはこれらのファイルを見つける方法をどのように知っていますか?

/usr/include内部に配線されたパスがありますか、それとも他のOSコンポーネントからパスを取得しますか?

回答:


188

gcc/が使用するデフォルトのパスg++とその優先順位を把握するには、次のコマンドの出力を調べる必要があります。

  1. 以下の場合C
    gcc -xc -E -v -
  1. 以下のためのC ++
    gcc -xc++ -E -v -

クレジットはQtクリエイターチームに送られます。


5
cpp -v /dev/null -o /dev/null
Nehal J Wani 2017

36

出力がより短いコマンドがあり、単一のスペースから始めて、行からインクルードパスを自動的にカットできます。

$ echo | gcc -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/backward
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
 /usr/local/include
 /usr/include
End of search list.

クレジットはlibc ++ フロントページに送られます


1

C ++を検討するためのIhor Kaharlichenkoの回答とその出力のコンパクトさについてのabyss.7の回答には同意しますが、入力処理はコマンドラインパラメーターとマクロに依存するため、gccのマルチアーチバージョンではまだ不完全です。

例:

echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -specs=nano.specs -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=soft -x c++ -E -Wp,-v\ - -fsyntax-only 収量


/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../arm-none-eabi/include/newlib-nano                                                                                                              
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m/nofp                                         
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
 /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  

一方、echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-only収量


/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi                                                          
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  

前者の呼び出しは利用しnewlib(出力の1行目と3行目を参照)、後者は標準インクルードに付属しています。リストの最後にある共通ファイルは、の使用例ですinclude_next

結論:インクルードディレクトリを印刷するときは、常にすべてのマクロコンパイラオプションを考慮してください。


1

以下を実行して、デフォルトの検索パスをリストします。

$(gcc -print-prog-name=cc1) -v

これには、インクルードパスはリストされません。プログラムパスとライブラリパスのみ
kayahr '20

cc1これは、PATH上にない内部コマンドであるため、通常は直接呼び出すことはできません。多分あなたはあなたの答えを編集してファイルを見つける場所を説明したいと思うかもしれません。
kayahr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.