Unixシステムでは、gccはヘッダーファイルをどこで検索しますか?
今朝、いくつかのシステムヘッダーファイルを探して少し時間を費やしたので、これはここにあると良い情報になると思いました。
`gcc -print-prog-name=cc1plus` -v
このコマンドはgccにどのC++プリプロセッサを使用しているかを尋ね、次にプリプロセッサにインクルードする場所を尋ねます。
特定のセットアップに対して信頼できる答えが得られます。
同様に、Cプリプロセッサの場合:
`gcc -print-prog-name=cpp` -v
さらに、gccは-I
オプションの後に指定されたディレクトリを調べます。
偽のシステムヘッダーを含めることを試みるファイルを作成できます。そのようなソースでgccを冗長モードで実行すると、偽のヘッダーを探すときにすべてのシステムが含まれる場所がリストされます。
$ echo "#include <bogus.h> int main(){}" > 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 Manual の CPPセクション は、ヘッダーファイルが次のディレクトリにあることを示しています。
GCCはいくつかの異なる場所でヘッダーを探します。通常のUnixシステムでは、特に指示しない限り、#includeで要求されたヘッダーを探します:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
C++プログラムの場合、最初に/ usr/include/g ++-v3も検索します。
g++ -print-search-dirs
gcc -print-search-dirs
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
コマンドは、この呼び出しが出力するすべてのotherジャンクを取り除き、LC_ALL=C
はsed
コマンドが機能することを確認します- 「ここから開始」および「検索リストの終了」フレーズare翻訳されたIIRC。)
コンパイラがヘッダーファイルを探すパスのセットは、次のコマンドで確認できます。
cpp -v
#include ""を宣言すると、コンパイラは最初にソースファイルの現在のディレクトリを検索します。見つからない場合は、上記の検索されたディレクトリで検索を続けます。
#include <>を宣言すると、コンパイラは上記のコマンドから取得したディレクトリを直接検索します。
ソース: http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
以下をチェックアウトすることにより、bashからCプログラムの(追加の)インクルードパスを表示できます。
echo $C_INCLUDE_PATH
これが空の場合、次の方法でデフォルトのインクルード場所を追加するように変更できます。
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
これらは、指定されたヘッダーファイルについてデフォルトでgccが検索するディレクトリです(ヘッダーファイルがシェブロン<>に含まれている場合)。 1./usr/local/include /-サードパーティのヘッダーファイルに使用されます。 2./usr/include /-システムヘッダーファイルに使用されます。
上記のディレクトリ以外の場所にカスタムヘッダーファイルを配置する場合、次のように含めることができます。1.シェブロンの代わりに、ファイルパスで引用符( "./custom_header_files/foo.h")を使用します。 includeステートメント内。 2.コードのコンパイル時に-Iスイッチを使用します。 gcc -I/home/user/custom_headers/-c foo.c -p foo.o基本的に-Iスイッチは、コンパイラに-Iスイッチで指定されたディレクトリを最初に調べるように指示します(標準ディレクトリをチェックする前)。 -Iスイッチを使用すると、シェブロンを使用してヘッダーファイルを含めることができます。