69

当我在 Linux 中编写 C 程序,然后使用 gcc 编译它们时,我总是很好奇那些头文件在哪里。例如,在哪里stdio.h。更一般地说,在哪里stdbool.h

我想知道的不仅是它在哪里,还想知道如何到达那些地方,例如使用shell命令或使用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

如果您知道包含文件的名称,一种方法是使用 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 | tail -1 | awk '{print $3}')/include/stdbool.h

于 2012-10-26T02:25:35.023 回答
0

当我在寻找(在 Fedora 25 上)时,我使用了“whereis stdio.h”对我来说,它在 /usr/include/stdio.h、/usr/shar/man/man3/stdio、3.gx 中。但是在查找文件时,请使用 whereis 或 locate

于 2017-01-24T06:58:36.020 回答
0

使用 vim 打开源文件并将诅咒放在 stdio.h 上,在正常模式下,命令“ gf ”将让 vim 为你打开 stdio.h 文件。

' Ctr + g ' 会让 vim 显示 stdio.h 的绝对路径

于 2019-06-17T09:50:20.363 回答