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

问题描述 投票:0回答:6

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

#include <foo.h>

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

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

c++ c gcc include g++
6个回答
150
投票
g++ -H ...

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


92
投票

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

gcc  -M showtime.c

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

gcc  -MM showtime.c

12
投票

确定使用

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

7
投票

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

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

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

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


6
投票

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


1
投票

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


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


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

© www.soinside.com 2019 - 2024. All rights reserved.