Answers:
`gcc -print-prog-name=cc1plus` -v
此命令询问gcc 它正在使用哪个C ++预处理器,然后询问该预处理器在哪里寻找include。
对于您的特定设置,您将获得可靠的答案。
同样,对于C预处理器:
`gcc -print-prog-name=cpp` -v
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
。
Ctrl
+ D
,在Unix对话中发送“文件结束”。
您可以创建一个试图包含虚假系统头的文件。如果在这样的源上以详细模式运行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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
或cpp -v < /dev/null
足够。您只需要让预处理器运行即可,无论看到什么输入都无所谓。(在启动过程中会搜索搜索路径,甚至不会查看其输入。)
GCC在几个不同的位置查找标头。在普通的Unix系统上,如果没有其他说明,它将在以下位置查找#include请求的标头:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
对于C ++程序,它还将首先显示在/ usr / include / g ++-v3中。
要使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)。
可以通过以下命令检查编译器在其中查找头文件的路径集:
cpp -v
如果声明#include“”,则编译器首先在源文件的当前目录中搜索,如果找不到,则继续在以上检索的目录中搜索。
如果声明#include <>,则编译器将直接在从上述命令获得的目录中搜索。
资料来源:-http : //commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
这些是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形符号包含头文件。