如何判断头文件的来源?


97

我如何知道g ++在哪里可以找到包含文件?基本上如果我

#include <foo.h>

g ++将使用任何包含选项添加或更改路径来扫描搜索路径。但是,最终,有什么方法可以告诉我g ++选择编译的foo.h的绝对路径吗?如果无数的搜索路径中有多个foo.h,则尤其有用。

缺少实现该目标的方法...是否有办法让g ++告诉我,包括默认值和所有include选项后其最终搜索路径是什么?


1
相关:是否有任何方法可以确定从哪个父包含文件包含一个子包含文件?即,显示包含的图表(提示:gcc -E尚不存在,可能正在处理以产生它。)
Krazy Glew 2013年

Answers:


78

这将提供make依赖关系,该依赖关系列出了包含文件的绝对路径:

gcc  -M showtime.c

如果您不希望系统包含(即#include <something.h>),请使用:

gcc  -MM showtime.c

18
应该注意的是,如果与“ -o myObj.o”一起使用,则输出(而不是编译的二进制文件)将进入“ myObj.o”。-M具有隐式-E,因此不会执行编译。我发现-MD是一个非常有用的选项,它执行编译并将输出放在myObj.d中。制作一个合适的参数以仅添加到您的编译行,而不会产生* .o之类的奇怪效果,现在它包含输出而不是二进制。谢谢你的帮助。
harschware 2011年

这里描述所有相关的gcc选项。
akhan

105
g++ -H ...

还将以某种格式显示包含文件的完整路径,该格式显示哪个标头包含哪个


7
根据我的经验,这似乎比-M更有用。我喜欢包含什么的层次显示。
Brian Minton 2013年

很好,对于调试目的很有帮助。

1
这是最好的答案。您可以将其添加到构建过程中,而无需进行其他任何更改。
Timmmm 2015年

4
这确实比接受的答案更能回答问题。唯一不幸的问题是我无法阻止Clang尝试正常编译文件,所以我最终使用了clang++ -MM -H(这是一个有用的组合)。
rookie1024

@ rookie1024,clang++ -H -fsyntax-only ...如果要避免生成输出文件(也可以使用gcc),请使用。
Lekensteyn

8

确定使用

g++ -E -dI  ... (whatever the original command arguments were)

2
此解决方案有几个好处:1.您可以发现单个头文件的多个包含(-H和-M仅将每个包含的文件打印一次)2.您可以看到包含的位置(原始文件的名称和行号)包括说明)。3.因此,您可以可靠地(!)区分标头是直接包含还是间接包含或包含两者(这对清理很重要。)
hagello

5

如果使用-MM或相关选项之一(-M,等等),则仅获得包含的标头列表,而没有所有其他预处理器输出(建议的g++ -E -dI解决方案似乎提供了此输出)。


g++ -MM t.cc仅显示完全不包含t.o: t.cc。还需要其他东西吗?
wallyk 2011年

3
很好-为完整起见,您可以使用该/showIncludes选项在MSVC中获得类似的效果。MSVC甚至会缩进显示标题的嵌套(我-M在GCC 上看不到)。
Michael Burr
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.