web-dev-qa-db-ja.com

LinuxでCプログラミング言語のヘッダーファイルを見つけるにはどうすればよいですか?

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

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

50
Yishu Fang

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です。

61
zwol

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
26
aschepler
locate stdio.h

または

mlocate stdio.h

ただし、locateはデータベースを使用します(データベースを更新したことがない場合)

Sudo updatedb

gccに問い合わせて、gcc自体によってスキャンされるデフォルトのディレクトリを確認することもできます。

gcc -print-search-dirs
22
guz

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

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

たとえば、コマンドラインでは、

cpp Filename.c

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

4
Sankar Mani

インクルードファイルの名前がわかっている場合は、findを使用する方法があります。

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

すべてのディレクトリを通過するのに時間がかかります。

2
Marvo

つかいます 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に保存します。

1
Xymostech

一般的なパスは次のとおりです。

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

1
Josmar

(Fedora 25で)探していたとき、「where is stdio.h」を使用しました。私にとっては、/ usr/include/stdio.h、/ usr/share/man/man3/stdio、3.gxにありました。ただし、ファイルを探している場合は、whereisまたはLocateを使用します

0
Jordan