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

Posted

技术标签:

【中文标题】gcc 在哪里寻找 C 和 C++ 头文件?【英文标题】:Where does gcc look for C and C++ header files? 【发布时间】:2010-09-25 13:13:45 【问题描述】:

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

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

【问题讨论】:

顺便说一下,如果你想知道.h文件的位置,请参阅***.com/a/18593344/1586797 【参考方案1】:
`gcc -print-prog-name=cc1plus` -v

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

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

同样,对于 C 预处理器:

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

【讨论】:

`s 是什么意思?我发现很难搜索。 @mijiturka What does ` (backquote/backtick) mean in bash? 我猜C 预处理器cpp而不是cc1?在我的 debian 上,jessie $(gcc -print-prog-name=cpp) -v(正确)提供了另一条路径,即 /usr/include/x86_64-linux-gnu 如果你不希望它在等待输入时挂起,请从/dev/null重定向输入,所以`gcc -print-prog-name=cc1` -v < /dev/null @SteveJorgensen 是的!或者按Ctrl+D,在 Unix-talk 中发送“文件结束”。【参考方案2】:

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

【讨论】:

@totaam:检查你的字体!这个答案使用“-I”(大写“eye”)而不是“-l”(小写“ell”)。 -I 用于 而 -iquote 用于“quotedfiles.h”【参考方案3】:

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

【讨论】:

我认为如果您只是说“使用 -v 选项”,这会更有帮助。 如果您使用“-v”而不使用包含不存在的系统头文件的 C 文件,您将不会导致 gcc 遍历所有包含路径。我的答案的关键是 bogus.h 被列为系统头文件。 @Jay - 你说得对,它太模糊了 - 我已经解释了我在 shell 脚本中所做的事情。 没有临时文件:echo "#include &lt;bogus.h&gt;" | gcc -v -x c - gcc -v -E - &lt; /dev/nullcpp -v &lt; /dev/null 就足够了。你只需要让预处理器运行,它看到什么输入并不重要。 (搜索路径在启动期间打印,甚至在它查看其输入之前。)【参考方案4】:

GCC Manual的CPP Section表示头文件可能位于以下目录:

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

 /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/c++/4.0.0 @Martin:你是老派。我的在 /usr/include/c++/4.2 :)【参考方案5】:

要让 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 命令是为了摆脱此调用打印的所有 other 垃圾,LC_ALL=C 是为了确保 sed 命令有效——“从这里开始"和“搜索列表结束”短语翻译为 IIRC。)

【讨论】:

【参考方案6】:
g++ -print-search-dirs
gcc -print-search-dirs

【讨论】:

这些命令打印链接库和编译器内部组件的默认搜索路径;他们没有告诉你任何关于头文件的信息。【参考方案7】:

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

cpp -v

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

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

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

【讨论】:

【参考方案8】:

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

echo $C_INCLUDE_PATH

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

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于gcc 在哪里寻找 C 和 C++ 头文件?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 头文件包含 <> 路径

关于在linux下用gcc编译头文件的问题。

linux-gcc 编译时头文件和库文件搜索路径

我想问一下vs 2008中的头文件的问题啊

GCC的头文件搜索路径

linux下编写c++,include的那些头文件在啥地方