当我在 Linux 中编写 C 程序,然后使用 gcc 编译它们时,我总是很好奇那些头文件在哪里。例如,在哪里stdio.h
。更一般地说,在哪里stdbool.h
?
我想知道的不仅是它在哪里,还想知道如何到达那些地方,例如使用shell命令或使用C编程语言。
当我在 Linux 中编写 C 程序,然后使用 gcc 编译它们时,我总是很好奇那些头文件在哪里。例如,在哪里stdio.h
。更一般地说,在哪里stdbool.h
?
我想知道的不仅是它在哪里,还想知道如何到达那些地方,例如使用shell命令或使用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 上)时,我使用了“whereis stdio.h”对我来说,它在 /usr/include/stdio.h、/usr/shar/man/man3/stdio、3.gx 中。但是在查找文件时,请使用 whereis 或 locate
使用 vim 打开源文件并将诅咒放在 stdio.h 上,在正常模式下,命令“ gf ”将让 vim 为你打开 stdio.h 文件。
' Ctr + g ' 会让 vim 显示 stdio.h 的绝对路径