gccはCおよびC ++ヘッダーファイルをどこで探しますか?


186

Unixシステムでは、gccはヘッダーファイルをどこで探しますか?

今朝は少し時間をかけてシステムヘッダーファイルを探していたので、ここにあるとよい情報だと思いました。

回答:


227
`gcc -print-prog-name=cc1plus` -v

このコマンドは、gccに使用しているC ++プリプロセッサーを尋ね、次にそのプリプロセッサーにインクルードを探す場所を尋ねます。

あなたはあなたの特定のセットアップに対して信頼できる答えを得るでしょう。

同様に、Cプリプロセッサーの場合:

`gcc -print-prog-name=cpp` -v

2
`sはどういう意味ですか?これを検索するのは難しいと思います。
mijiturka 2016年


5
私はCの推測プリプロセッサがあるcppの代わりにcc1?私のdebianジェシーに$(gcc -print-prog-name=cpp) -v(正しく)である1以上のパス、与え/usr/include/x86_64-linux-gnu
wlnirvana

3
あなたは、入力からリダイレクト入力を待ってハングアップしないようにしたい場合は/dev/nullそう、`gcc -print-prog-name=cc1` -v < /dev/null
Steve Jorgensen

@SteveJorgensenうん!またはCtrl+を押すとD、Unixトークで「ファイルの終わり」が送信されます。
Drew Dormann、2016年

40

さらに、gccは-Iオプションの後に指定されたディレクトリを調べます。



4
@totaam:フォントをチェックしてください!この回答では、「-l」(小文字の「エル」)ではなく「-I」(大文字の「目」)を使用しています。

3
-Iは<anglebracketed.h>用であり、-iquoteは "quotedfiles.h"用です
jcomeau_ictx

28

偽のシステムヘッダーを含めようとするファイルを作成できます。そのようなソースで冗長モードで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

3
これは、「-vオプションを使用する」とだけ言った方が便利だと思います。
ジェイコンロッド

存在しないシステムヘッダーを含むCファイルなしで "-v"を使用すると、gccがすべてのインクルードパスを反復処理することはありません。私の答えの鍵は、システムヘッダーとしてリストされているbogus.hです。
diciu 2008

@ジェイ-正解、あいまいすぎた-シェルスクリプトで私がやっていることを説明しました。
diciu 2008

9
一時ファイルなし:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe 2012

2
gcc -v -E - < /dev/nullまたはcpp -v < /dev/null十分です。プリプロセッサを実行する必要があるだけで、どの入力が表示されるかは関係ありません。(検索パスは、起動時に入力を確認する前に出力されます。)
zwol 2014

17

GCCマニュアルCPPセクションは、ヘッダーファイルが次のディレクトリにある可能性があることを示しています。

GCCはいくつかの異なる場所でヘッダーを探します。通常のUnixシステムでは、特に指示しない限り、#includeで要求されたヘッダーが検索されます。

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

C ++プログラムの場合、最初に/ usr / include / g ++-v3も検索します。


現在のバージョンのgccでは問題ありません。検索する実際のディレクトリは、gccのビルド時に指定されたオプションによって異なります。より良い解決策については、Shmooptyの回答を参照してください。
マーティンヨーク

PS:私のC ++ヘッダーファイルは次の場所にあります:/usr/include
Martin York

3
@マーティン:あなたは古い学校です。鉱山は/usr/include/c++/4.2にあります:)
トカゲに請求

10

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コマンドは、この呼び出しが出力するのすべてジャンクを取り除くLC_ALL=Cためのものであり、sedコマンドが機能することを確認するためのものです。「ここから開始」および「検索リストの終わり」句 IIRCに翻訳されます。)


9
g++ -print-search-dirs
gcc -print-search-dirs

3
これらのコマンドは、リンクライブラリとコンパイラの内部コンポーネントのデフォルトの検索パスを出力します。ヘッダーファイルについては何も教えられません。
zwol

6

コンパイラがヘッダーファイルを探すパスのセットは、次のコマンドで確認できます。

cpp -v

#include ""を宣言すると、コンパイラは最初にソースファイルの現在のディレクトリを検索し、見つからない場合は、上記で取得したディレクトリを引き続き検索します。

#include <>を宣言すると、コンパイラは上記のコマンドから取得したディレクトリを直接検索します。

ソース:-http : //commandlinefanatic.com/cgi-bin/showarticle.cgi ? article = art026


1

以下をチェックアウトすることで、bashからCプログラムの(追加の)インクルードパスを表示できます。

echo $C_INCLUDE_PATH

これが空の場合、次の方法でデフォルトのインクルード場所を追加するように変更できます。

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

これらは、指定されたヘッダーファイルの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スイッチを使用すると、シェブロンを使用してヘッダーファイルを含めることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.