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

Bil*_*ard 171 c gcc header

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

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

Dre*_*ann 212

`gcc -print-prog-name=cc1plus` -v
Run Code Online (Sandbox Code Playgroud)

这个命令询问gcc 它正在使用哪个C++预处理器,然后询问它所寻找的预处理器包括什么.

您将获得特定设置的可靠答案.

同样,对于C预处理器:

`gcc -print-prog-name=cpp` -v
Run Code Online (Sandbox Code Playgroud)

  • @mijiturka [什么`(反引号/反引号)在bash中意味着什么?](http://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-bash) (7认同)
  • 我猜C**预处理器**是`cpp`而不是`cc1`?在我的debian jessie` $(gcc -print-prog-name = cpp)-v`(正确)给出了另一条路径,即`/ usr/include/x86_64-linux-gnu` (5认同)
  • 这是什么意思?我发现很难找到这个. (2认同)
  • 如果你想要不挂起等待输入,重定向来自`/ dev/null`的输入,所以`\`gcc -print-prog-name = cc1 \`-v </ dev/null`. (2认同)

小智 36

此外,gcc将查看-I选项后指定的目录.


  • @totaam:检查你的字体!这个答案使用"-I"(大写"眼睛")而不是"-l"(小写"ell"). (3认同)
  • -I用于<anglebracketed.h>,而-iquote用于"quotedfiles.h" (3认同)

dic*_*ciu 24

您可以创建一个尝试包含伪造系统标头的文件.如果在这样的源上以详细模式运行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
Run Code Online (Sandbox Code Playgroud)

  • 没有临时文件:`echo"#include <bogus.h>"| gcc -v -xc -` (9认同)
  • 我认为,如果您只是说“使用-v选项”,这将更加有用。 (2认同)
  • `gcc -v -E - </ dev/null`或`cpp -v </ dev/null`就足够了.你只需要让预处理器运行*run*,它看到的输入无关紧要.(搜索路径在启动期间打印,甚至在查看其输入之前.) (2认同)

Bil*_*ard 17

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

GCC在几个不同的地方寻找标题.在普通的Unix系统上,如果你不指示它,它将在#include中寻找请求的头:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include
Run Code Online (Sandbox Code Playgroud)

对于C++程序,它首先也会查看/ usr/include/g ++ - v3.

  • @Martin:你老了.我在/usr/include/c++/4.2 :) (2认同)

zwo*_*wol 8

要让GCC打印出它将查找系统头的完整目录集,请像这样调用它:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'
Run Code Online (Sandbox Code Playgroud)

这将产生表格的输出

#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.
Run Code Online (Sandbox Code Playgroud)

如果-I在命令行上有-family选项,它们将影响打印出来的内容.

(该sed命令是为了摆脱这个调用所打印的所有其他垃圾,并且LC_ALL=C确保该sed命令有效 - "从这里开始"和"搜索结束列表"短语翻译成IIRC.)


Suh*_*nna 8

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

cpp -v

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

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

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


小智 7

g++ -print-search-dirs
gcc -print-search-dirs
Run Code Online (Sandbox Code Playgroud)

  • 这些命令打印链接库和编译器内部组件的默认搜索路径;他们不会告诉你任何关于头文件的信息。 (4认同)