如何判断头文件是从哪里包含的?

我怎样才能知道 g + + 在哪里能够找到一个包含文件? 基本上如果我

#include <foo.h>

G + + 将扫描搜索路径,使用任何包含选项来添加或更改路径。但是,到最后,有没有一种方法可以告诉我 foo.h 的绝对路径是 g + + 选择编译的?如果在无数的搜索路径中有不止一个 foo.h,那么这个问题就尤其相关。

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

66161 次浏览

当然有用

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

如果您使用 -MM或其中一个相关选项(-M等) ,那么您只会得到包含在其中的标头列表,而不会得到所有其他预处理器输出(这似乎是使用建议的 g++ -E -dI解决方案得到的)。

这将使 make 依赖项列出 include 文件的绝对路径:

gcc  -M showtime.c

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

gcc  -MM showtime.c
g++ -H ...

还将打印包含文件的完整路径,其格式将显示哪个头包含哪个

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

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

这将(几乎可以肯定)导致文件顶部附近的编译错误。它应该显示一个编译器错误,其中包含编译器看到的路径。

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

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


(这是迈克尔 · 伯尔在 这个答案上的一篇评论中提到的,但是我想让它更加明显,因此把它作为一个单独的答案添加进去。)


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