当我在 Linux 中编写 C 程序,然后使用 gcc 编译它们时,我总是很好奇那些头文件在哪里。例如,stdio.h所在的位置。更一般地说,stdbool.h在哪里?
stdio.h
stdbool.h
我想知道的不仅是它在哪里,还有如何获得这些位置,例如,使用 shell 命令或使用 C 编程语言。
使用 gcc -v可以检查包含路径。 通常,根据库安装的不同,包含文件位于 /usr/include或 /usr/local/include中。
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中。
/usr/include/c++/4.7.2/tr1/stdbool.h
/usr/lib/clang/3.1/include/stdbool.h
locate stdio.h
或者
mlocate stdio.h
但是 locate依赖于数据库,如果你从来没有更新过它
locate
sudo updatedb
你也可以向 gcc查询 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) :
gcc -H ...
-fsyntax-only
$ 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嵌套的深度。
#include
如果您使用 gcc,您可以使用以下内容检查特定的文件:
echo '#include <stdbool.h>' | cpp -H -o /dev/null 2>&1 | head -n1
-H要求预处理器递归地打印所有包含的文件。head -n1只接受该命令的第一行输出,忽略命名头部包含的任何文件(尽管 stdbool.h 可能不会这样做)。
-H
head -n1
例如,在我的电脑上,以上输出:
. /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdbool.h
在预处理期间,所有的预处理器指令将被实际替换。像宏扩展,代码注释删除,包括头文件源代码等。.
我们可以使用 cpp-C 预处理器命令来检查它。
cpp
例如在命令行中:
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 的绝对路径