Unix システムでは、gcc はヘッダー ファイルをどこで検索しますか?
今朝、システム ヘッダー ファイルを探すのに少し時間を費やしました。
`gcc -print-prog-name=cc1plus` -v
このコマンドは、どのC++プリプロセッサを使用しているかを gcc に尋ね、次にそのプリプロセッサがインクルードを探す場所を尋ねます。
特定の設定について信頼できる回答が得られます。
同様に、Cプリプロセッサの場合:
`gcc -print-prog-name=cpp` -v
さらに、gcc は-I
オプションの後に指定されたディレクトリを検索します。
偽のシステムヘッダーを含めようとするファイルを作成できます。そのようなソースで冗長モードでgccを実行すると、偽のヘッダーを探すときに、システムに含まれるすべての場所が一覧表示されます。
$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c
[..]
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-apple-darwin9/4.0.1/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
[..]
t.c:1:32: error: bogus.h: No such file or directory
GCC マニュアルのCPP セクションには、ヘッダー ファイルが次のディレクトリにある可能性があることが示されています。
GCC は、いくつかの異なる場所でヘッダーを探します。通常の Unix システムでは、特に指示がない場合、#include で要求されたヘッダーを次の場所で探します。
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
C++ プログラムの場合、最初に /usr/include/g++-v3 も調べます。
システム ヘッダーを探すディレクトリの完全なセットを GCC に出力させるには、次のように呼び出します。
$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 |
LC_ALL=C sed -ne '/starts here/,/End of/p'
フォームの出力を生成します
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
-I
コマンド ラインに -family オプションがある場合、出力される内容に影響します。
(コマンドは、この呼び出しが出力する他sed
のすべてのジャンクを取り除くことであり、コマンドが機能することを確認することです。「ここから開始」および「検索リストの終わり」というフレーズはIIRC に翻訳されています。)LC_ALL=C
sed
g++ -print-search-dirs
gcc -print-search-dirs
以下をチェックアウトすることで、bash から C プログラムの (追加の) インクルード パスを表示できます。
echo $C_INCLUDE_PATH
これが空の場合は、次の方法で、デフォルトのインクルード ロケーションを追加するように変更できます。
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include