如何判断包含头文件的位置?

har*_*are 89 c c++ gcc g++ include

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

#include <foo.h>
Run Code Online (Sandbox Code Playgroud)

g ++将扫描搜索路径,使用任何include选项添加或更改路径.但是,在几天结束时,有没有办法告诉f ++的绝对路径g ++选择编译?如果在无数的搜索路径中有多个foo.h,则特别相关.

没有一种方法可以实现...有没有办法让g ++告诉我在包括默认值和所有包含选项之后它的最终搜索路径是什么?

Bul*_*net 96

g++ -H ...
Run Code Online (Sandbox Code Playgroud)

还将以一种格式打印包含文件的完整路径,该格式显示哪个标题包含哪个

  • 根据我的经验,这似乎比-M更有帮助.我喜欢包含什么的分层显示. (7认同)
  • 这真的回答了问题而不是接受的答案.唯一不幸的问题是我无法阻止Clang试图正常编译文件,所以我最终使用`clang ++ -MM -H`(这是一个稍微有用的组合). (4认同)
  • 这是最好的答案。您可以将其添加到构建过程中,而无需更改任何其他内容。 (2认同)

Sod*_*ved 72

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

gcc  -M showtime.c
Run Code Online (Sandbox Code Playgroud)

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

gcc  -MM showtime.c
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,如果与"-o myObj.o"一起使用,输出而不是编译的二进制文件将进入"myObj.o".-M具有隐式-E,因此编译不会被执行.我发现-MD是一个非常有用的选项,它执行编译并将输出放在myObj.d中.制作一个合适的参数,只是在你的编译行之前没有奇怪的效果,如*.o现在包含输出而不是二进制.谢谢你的帮助. (17认同)

wal*_*lyk 7

一定要用

g++ -E -dI  ... (whatever the original command arguments were)
Run Code Online (Sandbox Code Playgroud)

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

sud*_*ash 7

如果您的构建过程非常复杂......

constexpr static auto iWillBreak = 
#include "where/the/heck/is/this/file.h"
Run Code Online (Sandbox Code Playgroud)

这(几乎肯定)会导致相关文件顶部附近出现编译错误。这应该会向您显示编译器看到的路径的编译器错误。

显然这比其他答案更糟糕,但有时这种黑客是有用的。


Jon*_*ler 5

如果您使用-MM或使用其中一个相关选项(-M等),您只需获得包含的标题列表,而不包含所有其他预处理器输出(您似乎从建议的g++ -E -dI解决方案中获得).

  • 不错-为完整起见,您可以使用`/ showIncludes`选项获得与MSVC类似的效果。MSVC甚至会缩进以向您显示标头的嵌套(我在GCC上没有看到`-M`)。 (3认同)