在Unix系统中,gcc在哪里查找头文件?

今天早上我花了一点时间寻找一些系统头文件,所以我认为这将是很好的信息。


当前回答

编译器查找头文件的路径集可以通过以下命令检查:-

CPP -V

如果声明#include "",编译器首先在源文件的当前目录中搜索,如果没有找到,则继续在上述检索到的目录中搜索。

如果声明#include <>,编译器将直接在从上述命令获得的目录中搜索。

来源:http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

其他回答

此外,gcc将查找在-I选项后指定的目录。

您可以创建一个试图包含伪系统头的文件。 如果在这样的源上以详细模式运行gcc,它将在查找伪标头时列出所有系统包含位置。

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory
g++ -print-search-dirs
gcc -print-search-dirs

编译器查找头文件的路径集可以通过以下命令检查:-

CPP -V

如果声明#include "",编译器首先在源文件的当前目录中搜索,如果没有找到,则继续在上述检索到的目录中搜索。

如果声明#include <>,编译器将直接在从上述命令获得的目录中搜索。

来源:http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

为了让GCC打印出它将在其中查找系统头文件的完整目录集,像这样调用它:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

哪个将产生表单的输出

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

如果在命令行上有-I-family选项,它们将影响输出的内容。

(sed命令是为了清除调用打印的所有其他垃圾,LC_ALL=C是为了确保sed命令正常工作——“从这里开始”和“搜索列表结束”短语被翻译为IIRC。)