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
前処理された出力が表示されます。
インクルードファイルの名前がわかっている場合は、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 | tail -1 | awk '{print $ 3}')/ include/stdbool.h
(Fedora 25で)探していたとき、「where is stdio.h」を使用しました。私にとっては、/ usr/include/stdio.h、/ usr/share/man/man3/stdio、3.gxにありました。ただし、ファイルを探している場合は、whereisまたはLocateを使用します