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


185

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

我今天早上花了一些时间来寻找一些系统头文件,因此我认为这里是个不错的信息。

Answers:


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

此命令询问gcc 它正在使用哪个C ++预处理器,然后询问该预处理器在哪里寻找include。

对于您的特定设置,您将获得可靠的答案。

同样,对于C预处理器:

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

2
`是什么意思?我发现很难搜索到它。
mijiturka's


5
我猜的C 预处理器cpp不是cc1?在我的debian jessie上$(gcc -print-prog-name=cpp) -v(正确)给出了另一条路径,即/usr/include/x86_64-linux-gnu
wlnirvana

3
如果您不想挂起等待输入,请从重定向输入/dev/null,所以`gcc -print-prog-name=cc1` -v < /dev/null
史蒂夫·乔根森

@SteveJorgensen是的!或者按Ctrl+ D,在Unix对话中发送“文件结束”。
德鲁·多曼

40

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



4
@totaam:检查字体!此答案使用“ -I”(大写的“眼睛”)而不是“ -l”(小写的“ ell”)。

3
-I表示<anglebracketed.h>,而-iquote表示“ quotedfiles.h”
jcomeau_ictx 2014年

28

您可以创建一个试图包含虚假系统头的文件。如果在这样的源上以详细模式运行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

3
我认为,如果您只是说“使用-v选项”,这将更加有用。
杰·康罗德

好吧,如果您使用“ -v”而没有包含不存在的系统头文件的C文件,则不会导致gcc遍历所有包含路径。我的答案的关键是bogus.h作为系统标题列出。
diciu

@Jay-您是对的,太含糊-我已经解释了我在Shell脚本中所做的事情。
diciu

9
没有临时文件:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe 2012年

2
gcc -v -E - < /dev/nullcpp -v < /dev/null足够。您只需要让预处理器运行即可,无论看到什么输入都无所谓。(在启动过程中会搜索搜索路径,甚至不会查看其输入。)
zwol 2014年

17

CPP科的的GCC手册表明,头文件可能位于以下目录:

GCC在几个不同的位置查找标头。在普通的Unix系统上,如果没有其他说明,它将在以下位置查找#include请求的标头:

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

对于C ++程序,它还将首先显示在/ usr / include / g ++-v3中。


这对于您当前的gcc版本很好。它查找的实际目录取决于构建gcc时指定的选项。请参阅Shmoopty答案以获得更好的解决方案。
马丁·约克

PS:我的C ++头文件位于:/usr/include
Martin York

3
@马丁:你是老学校。我的在/usr/include/c++/4.2 :)
Bill the Lizard

10

要使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)。


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

3
这些命令显示链接库和编译器内部组件的默认搜索路径;他们没有告诉您有关头文件的任何信息。
zwol


1

通过检查以下内容,可以从bash查看C程序的(附加)包含路径:

echo $C_INCLUDE_PATH

如果为空,则可以通过以下方式对其进行修改以添加默认的包含位置:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.