203

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

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

4

9 回答 9

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

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

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

同样,对于C预处理器:

`gcc -print-prog-name=cpp` -v
于 2008-12-05T17:02:48.487 回答
44

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


于 2008-12-05T16:13:00.570 回答
32

您可以创建一个尝试包含虚假系统标头的文件。如果您在此类源上以详细模式运行 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
于 2008-12-05T16:42:55.720 回答
18

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

GCC 在几个不同的地方寻找标题。在一个普通的 Unix 系统上,如果你没有另外指示它,它会寻找用 #include 请求的头文件:

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

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

于 2008-12-05T16:03:23.193 回答
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。)

于 2015-11-02T19:48:10.640 回答
10
g++ -print-search-dirs
gcc -print-search-dirs
于 2016-12-29T14:29:59.270 回答
9

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

cpp -v

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

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

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

于 2017-01-18T11:53:25.867 回答
1

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

echo $C_INCLUDE_PATH

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

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
于 2013-10-03T22:58:02.700 回答
1

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

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

于 2017-04-09T08:02:38.987 回答