如何在 Linux 中找到 C 编程语言的头文件?

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

我想知道的不仅是它在哪里,还有如何获得这些位置,例如,使用 shell 命令或使用 C 编程语言。

102660 次浏览

使用 gcc -v可以检查包含路径。 通常,根据库安装的不同,包含文件位于 /usr/include/usr/local/include中。

如果您知道 include 文件的名称,一种方法是使用 find:

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

这需要一段时间,因为它通过每个目录。

大多数标准报头存储在 /usr/include中。看起来 stdbool.h存储在其他地方,这取决于您使用的编译器。例如,g + + 将其存储在 /usr/include/c++/4.7.2/tr1/stdbool.h中,而 clang 将其存储在 /usr/lib/clang/3.1/include/stdbool.h中。

locate stdio.h

或者

mlocate stdio.h

但是 locate依赖于数据库,如果你从来没有更新过它

sudo updatedb

你也可以向 gcc查询 gcc自己扫描的默认目录:

gcc -print-search-dirs

我认为一般的路径是:

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

作为常规编译的副作用,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

在预处理期间,所有的预处理器指令将被实际替换。像宏扩展,代码注释删除,包括头文件源代码等。.

我们可以使用 cpp-C 预处理器命令来检查它。

例如在命令行中:

cpp Filename.c

显示预处理输出。

当我在 Fedora 25上查找时,我使用了“ where is stdio.h”,它位于/usr/include/stdio.h,/usr/shar/man/man3/stdio,3。Gx.但是,当您正在寻找文件,使用位置或定位

使用 vim 打开源文件并将 curses 放在 stdio.h 上,在普通模式下,命令‘ 女朋友’将允许 vim 为您打开 stdio.h 文件。

Ctr + g’将允许 vim 显示 stdio.h 的绝对路径