如何判断头文件包含在哪里?

Posted

技术标签:

【中文标题】如何判断头文件包含在哪里?【英文标题】:How to tell where a header file is included from? 【发布时间】:2011-08-15 15:22:56 【问题描述】:

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

#include <foo.h>

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

没有办法做到这一点...有没有办法让 g++ 告诉我在包含默认值和所有包含选项后它的最终搜索路径是什么?

【问题讨论】:

相关:有什么方法可以判断子包含文件是从哪个父包含文件中包含的? IE。显示包含的图表(提示:gcc -E 不完全存在......可能会被处理以产生它。) 【参考方案1】:
g++ -H ...

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

【讨论】:

根据我的经验,这似乎比 -M 更有帮助。我喜欢什么包含什么的分层显示。 很好,对调试很有帮助。 这是最好的答案。您可以将其添加到您的构建过程中,而无需更改任何其他内容。 这确实比公认的答案更能回答问题。唯一不幸的问题是我无法阻止 Clang 尝试正常编译文件,所以我最终使用了clang++ -MM -H(这是一个稍微有用的组合)。 @rookie1024 如果您想避免生成输出文件,请使用clang++ -H -fsyntax-only ...(也适用于gcc)。【参考方案2】:

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

gcc  -M showtime.c

如果您不希望系统包含(即#include &lt;something.h&gt;),请使用:

gcc  -MM showtime.c

【讨论】:

需要注意的是,如果与“-o myObj.o”一起使用,输出,而不是编译后的二进制文件,会进入“myObj.o”。 -M 有一个隐含的 -E,因此不执行编译。我发现 -MD 是一个非常有用的选项,它执行编译并将输出放在 myObj.d 中。为您的编译行添加一个合适的参数,而不会产生像 *.o 这样的奇怪效果,现在包含输出而不是二进制文件。感谢您的帮助。 所有相关的 gcc 选项都描述了here。【参考方案3】:

一定要使用

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

【讨论】:

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

如果您使用-MM 或相关选项之一(-M 等),您将仅获得包含的标头列表,而没有所有其他预处理器输出(您似乎可以通过建议的 @ 987654323@解决方案)。

【讨论】:

g++ -MM t.cc 根本没有显示包含,只是 t.o: t.cc。它还需要别的东西吗? 很好 - 为了完整起见,您可以使用 /showIncludes 选项与 MSVC 类似。 MSVC 甚至会缩进以显示标题的嵌套(我在 GCC 上看不到 -M)。【参考方案5】:

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

constexpr static auto iWillBreak = 
#include "where/the/heck/is/this/file.h"

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

显然这比其他答案更糟糕,但有时这种 hack 很有用。

【讨论】:

我发现这非常有用,特别是因为它适用于不同的编译器并且指向我想要的文件。【参考方案6】:

对于 MSVC,您可以使用 /showInclude 选项,该选项将显示包含的文件。


(Michael Burr 在this answer 的评论中对此进行了说明,但我想让它更明显,因此将其添加为单独的答案。)


可用性说明:编译器会将此信息发送到标准错误输出,在使用 windows 命令提示符时,默认情况下似乎会被抑制。使用2&gt;&amp;1 将stderr 重定向到stdout 以查看它。

【讨论】:

以上是关于如何判断头文件包含在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

linux 下的内核头文件放在哪里

为啥在vs中我在头文件中设置了一个文件。在源文件中#include包含。当编译源文件时老说错误

如何查找包含标题的位置

C语言包含头文件是啥?

头文件是如何实现的,比如一个 string.h 文件[关闭]

关于include头文件的问题