203

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

今朝、システム ヘッダー ファイルを探すのに少し時間を費やしました。

4

9 に答える 9

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

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

特定の設定について信頼できる回答が得られます。

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

`gcc -print-prog-name=cpp` -v
于 2008-12-05T17:02:48.487 に答える
44

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


于 2008-12-05T16:13:00.570 に答える
32

偽のシステムヘッダーを含めようとするファイルを作成できます。そのようなソースで冗長モードで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
于 2008-12-05T16:42:55.720 に答える
18

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

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

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

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

于 2008-12-05T16:03:23.193 に答える
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のすべてのジャンクを取り除くことであり、コマンドが機能することを確認することです。「ここから開始」および「検索リストの終わり」というフレーズIIRC に翻訳されています。)LC_ALL=Csed

于 2015-11-02T19:48:10.640 に答える
10
g++ -print-search-dirs
gcc -print-search-dirs
于 2016-12-29T14:29:59.270 に答える
1

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

echo $C_INCLUDE_PATH

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

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
于 2013-10-03T22:58:02.700 に答える