Linux で C プログラムを作成し、gcc を使用してコンパイルするとき、それらのヘッダー ファイルがどこにあるのか常に気になります。たとえば、どこstdio.h
ですか。より一般的には、どこstdbool.h
ですか?
私が知りたいのは、それがどこにあるかだけでなく、それらの場所を取得する方法、たとえばシェル コマンドを使用したり、C プログラミング言語を使用したりすることです。
Linux で C プログラムを作成し、gcc を使用してコンパイルするとき、それらのヘッダー ファイルがどこにあるのか常に気になります。たとえば、どこstdio.h
ですか。より一般的には、どこstdbool.h
ですか?
私が知りたいのは、それがどこにあるかだけでなく、それらの場所を取得する方法、たとえばシェル コマンドを使用したり、C プログラミング言語を使用したりすることです。
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
。
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
locate stdio.h
また
mlocate stdio.h
ただしlocate
、データベースを更新したことがない場合は、データベースに依存しています
sudo updatedb
gcc
また、それ自体でスキャンされるデフォルトのディレクトリを調べることもできますgcc
:
gcc -print-search-dirs
前処理中に、すべてのプリプロセッサ ディレクティブが実際のものに置き換えられます。マクロの展開、コードコメントの削除、ヘッダーファイルのソースコードを含むなど...
cpp
-C PreProcessor コマンドを使用して確認できます。
たとえば、コマンド ラインで次のように指定します。
cpp Filename.c
前処理された出力を表示します。
インクルード ファイルの名前がわかっている場合の 1 つの方法は、find を使用することです。
cd /
find . -name "stdio.h"
find . -name "std*.h"
すべてのディレクトリを通過するので、しばらく時間がかかります。
を使用するgcc -v
と、インクルード パスを確認できます。通常、インクルード ファイルは、ライブラリのインストールに含まれている/usr/include
か/usr/local/include
、ライブラリのインストールに依存しています。
ほとんどの標準ヘッダーは に格納されてい/usr/include
ます。他の場所に保存されているように見えstdbool.h
、使用しているコンパイラによって異なります。たとえば、g++ は に格納しますが/usr/include/c++/4.7.2/tr1/stdbool.h
、clang は に格納し/usr/lib/clang/3.1/include/stdbool.h
ます。
一般的なパスは次のとおりだと思います。
/usr/lib/gcc/$(ls /usr/lib/gcc/)/$(gcc -v 2>&1 | テール -1 | awk '{print $3}')/include/stdbool.h