gcc在哪里查找C和C ++头文件?

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

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

`gcc -print-prog-name=cc1plus` -v 

这个命令询问gcc使用哪个C ++预处理程序,然后询问预处理器在哪里寻找include。

你会得到一个可靠的答案为您的具体设置。

同样,对于C预处理器:

 `gcc -print-prog-name=cc1` -v 

另外,gcc会查找-I选项后指定的目录。

您可以创build一个试图包含伪造系统标题的文件。 如果您在这种源代码上以详细模式运行gcc,它将列出所有系统包含位置,因为它会查找伪造标题。

 $ echo "#include &lt;bogus.h&gt; int main(){}" > tc; gcc -v tc; rm tc [..] #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. [..] tc:1:32: error: bogus.h: No such file or directory 

GCC手册的CPP部分指出头文件可能位于以下目录中:

GCC在几个不同的地方查找标题。 在一个普通的Unix系统上,如果你不指示它,它将查找请求的头文件#include in:

  /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include 

对于C ++程序,它也将首先在/ usr / include / g ++ – v3中查找。

为了让GCC打印出完整的目录,find系统头文件,像这样调用它:

 $ 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命令的作品 – “从这里开始”和“结束search列表”短语翻译IIRC。)

 g++ -print-search-dirs gcc -print-search-dirs 

可以通过检查以下内容来查看bash的C程序的(附加的)包含path:

 echo $C_INCLUDE_PATH 

如果这是空的,可以修改它以添加默认包含位置,方法是:

 export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 

编译器查找头文件的path集可以通过命令来检查: –

cpp -v

如果声明了#include“” ,编译器首先在源文件的当前目录中search,如果没有find,继续在上面检索的目录中search。

如果声明#include <> ,则编译器会直接在从上述命令获得的那些目录中进行search。

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

这些是gcc在默认情况下为指定的头文件查找的目录(假设头文件被包含在V形符中) 1. / usr / local / include / – 用于第三方头文件。 2. / usr / include / – 用于系统头文件。

如果您决定将您的自定义头文件放在上述目录以外的位置,可以按如下方式包含它们:1.使用带有文件path的引号(“./custom_header_files/foo.h”)而不是V形符号在include语句中。 2.编译代码时使用-I开关。 gcc -I / home / user / custom_headers / -c foo.c -p foo.o基本上,-I开关告诉编译器先查看-I开关指定的目录(在检查标准目录之前)。使用-I开关,头文件可以使用人字形包含在内。