69

Linux で C プログラムを作成し、gcc を使用してコンパイルするとき、それらのヘッダー ファイルがどこにあるのか常に気になります。たとえば、どこstdio.hですか。より一般的には、どこstdbool.hですか?

私が知りたいのは、それがどこにあるかだけでなく、それらの場所を取得する方法、たとえばシェル コマンドを使用したり、C プログラミング言語を使用したりすることです。

4

10 に答える 10

78

gcc -H ...通常のコンパイルの副作用として、すべてのインクルード ファイルのフル パスを出力します。さらに使用-fsyntax-onlyして、出力を作成しないようにします (プログラムにエラーがあるかどうかは引き続き通知されます)。例 (Linux、gcc-4.7):

$ cat > test.c
#include <stdbool.h>
#include <stdio.h>
^D
$ gcc -H -fsyntax-only test.c
. /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdbool.h
. /usr/include/stdio.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/bits/predefs.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/types.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/typesizes.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h

各行の先頭にあるドットは、ネストの深さをカウントします#include

于 2012-10-26T02:44:43.103 に答える
42

gcc を使用している場合は、次のような方法で特定のファイルをチェックできます。

echo '#include <stdbool.h>' | cpp -H -o /dev/null 2>&1 | head -n1

-H含まれているすべてのファイルを再帰的に出力するようにプリプロセッサに要求します。 head -n1そこから出力の最初の行だけを取得して、名前付きヘッダーに含まれるファイルを無視します (特に stdbool.h はおそらくそうではありません)。

たとえば、私のコンピューターでは、上記の出力は次のようになります。

. /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdbool.h
于 2012-10-26T02:51:18.400 に答える
31
locate stdio.h

また

mlocate stdio.h

ただしlocate、データベースを更新したことがない場合は、データベースに依存しています

sudo updatedb

gccまた、それ自体でスキャンされるデフォルトのディレクトリを調べることもできますgcc:

gcc -print-search-dirs
于 2012-10-26T01:39:13.687 に答える
6

前処理中に、すべてのプリプロセッサ ディレクティブが実際のものに置き換えられます。マクロの展開、コードコメントの削除、ヘッダーファイルのソースコードを含むなど...

cpp-C PreProcessor コマンドを使用して確認できます。

たとえば、コマンド ラインで次のように指定します。

cpp Filename.c

前処理された出力を表示します。

于 2012-10-26T03:31:58.590 に答える
3

インクルード ファイルの名前がわかっている場合の 1 つの方法は、find を使用することです。

cd /
find . -name "stdio.h"
find . -name "std*.h"

すべてのディレクトリを通過するので、しばらく時間がかかります。

于 2012-10-26T01:37:20.487 に答える
1

を使用するgcc -vと、インクルード パスを確認できます。通常、インクルード ファイルは、ライブラリのインストールに含まれている/usr/include/usr/local/include、ライブラリのインストールに依存しています。

于 2012-10-26T01:36:56.973 に答える
1

ほとんどの標準ヘッダーは に格納されてい/usr/includeます。他の場所に保存されているように見えstdbool.h、使用しているコンパイラによって異なります。たとえば、g++ は に格納しますが/usr/include/c++/4.7.2/tr1/stdbool.h、clang は に格納し/usr/lib/clang/3.1/include/stdbool.hます。

于 2012-10-26T01:37:35.447 に答える
1

一般的なパスは次のとおりだと思います。

/usr/lib/gcc/$(ls /usr/lib/gcc/)/$(gcc -v 2>&1 | テール -1 | awk '{print $3}')/include/stdbool.h

于 2012-10-26T02:25:35.023 に答える