我怎样才能知道 g + + 在哪里能够找到一个包含文件? 基本上如果我
#include <foo.h>
G + + 将扫描搜索路径,使用任何包含选项来添加或更改路径。但是,到最后,有没有一种方法可以告诉我 foo.h 的绝对路径是 g + + 选择编译的?如果在无数的搜索路径中有不止一个 foo.h,那么这个问题就尤其相关。
如果没有办法实现这一点... ... 有没有办法让 g + + 在包含默认值和所有包含选项之后告诉我它的最终搜索路径是什么?
当然有用
g++ -E -dI ... (whatever the original command arguments were)
如果您使用 -MM或其中一个相关选项(-M等) ,那么您只会得到包含在其中的标头列表,而不会得到所有其他预处理器输出(这似乎是使用建议的 g++ -E -dI解决方案得到的)。
-MM
-M
g++ -E -dI
这将使 make 依赖项列出 include 文件的绝对路径:
gcc -M showtime.c
如果您不希望系统包括(即 #include <something.h>) ,那么使用:
#include <something.h>
gcc -MM showtime.c
g++ -H ...
还将打印包含文件的完整路径,其格式将显示哪个头包含哪个
如果您的构建过程非常复杂..。
constexpr static auto iWillBreak = #include "where/the/heck/is/this/file.h"
这将(几乎可以肯定)导致文件顶部附近的编译错误。它应该显示一个编译器错误,其中包含编译器看到的路径。
显然,这比其他答案更糟糕,但有时这种黑客攻击是有用的。
对于 MSVC,您可以使用 /showInclude选项,它将显示所包含的文件。
/showInclude
(这是迈克尔 · 伯尔在 这个答案上的一篇评论中提到的,但是我想让它更加明显,因此把它作为一个单独的答案添加进去。)
可用性说明: 编译器会将这些信息发送到标准错误输出,而在默认情况下,这些错误输出在使用命令提示符时似乎被抑制了。尽管如此,使用 2>&1将 stderr 重定向到 stdout 以查看它。
2>&1