【问题标题】:Tool to track #include dependencies [closed]跟踪#include依赖项的工具[关闭]
【发布时间】:2025-12-16 04:45:01
【问题描述】:

有什么好的建议吗?输入将是头文件的名称,输出应该是直接或间接包括它的所有文件的列表(最好是树)。

【问题讨论】:

  • 这不是关于“最喜欢的”包含在 gcc 中很好地显示,但 msvs 没有。所以我们(我)正在寻找任何工具。
  • 为什么我总是发现“离题”的问题很有帮助?
  • @jfritz42:这应该被授予“年度评论”奖!有这么多话题和这么多用户,一个版主怎么可能给一个问题贴上“离题”的标签?
  • 我想指出,还有很多工具可以处理#include 依赖项,例如cpp-dependenciesiwyudep-matrix,这是一个用python 编写的非常简单的工具。跨度>
  • @jfritz42 数字很清楚:123 票和 62 票。很多人都是这样看的。奇怪的 SO 标准。我也怀疑这些问题在 SuperUser 上是否会有同样好的答案。

标签: c++ c header


【解决方案1】:

如果您可以访问 GCC/G++,那么-M option 将输出依赖列表。它不会像其他工具那样做任何额外的事情,但由于它来自编译器,所以它不可能从“错误”的地方拾取文件。

【讨论】:

  • -H 甚至给了一棵树!
  • -MM 跳过系统标头
  • 还有-o 选项,编译器会将输出写入文件而不是标准输出。
  • @SamB 这仅在没有错误的情况下有效,并打印到stderr 而不是stdout。否则,此选项更通用。
  • 这个我给一千分-
【解决方案2】:

感谢 KeithB。我查找了 cl.exe (VS2008) 的文档并找到了 /showIncludes 标志。在 IDE 中,可以从任何 CPP 文件的属性页进行设置。

【讨论】:

  • 这对于解决一些非常困难的编译错误/警告非常有用。非常感谢!
  • 这在尝试优化预编译头文件时也非常非常方便!
  • 在VS工作时,我认为这是解决我问题的最快解决方案~ :-)
  • 这似乎不起作用,如果某些标头确实包含 std c 标头,例如math.h
【解决方案3】:

对于重量级解决方案,您应该查看doxygen。它会扫描您的代码库,然后创建一个网站,有效地记录您的代码。它显示的众多内容之一是包含树木。

如果您希望能够将此工具的输出插入到其他进程中,那么这可能不适合您(尽管 doxygen 确实输出到其他格式,但我并不真正熟悉该功能)。但是,如果您只是想观察依赖关系,它应该会很好用。

【讨论】:

  • 那如何确定“不必要的”???我有“foo.cpp”,它包括(直接或间接“bar.h”...删除 bar.h 是否会导致 foo.cpp 的编译输出出现任何差异??如果答案是否定的,那么它是不必要的包含。这 hard....
【解决方案4】:

我玩过一个名为cinclude2dot 的工具。当我来到这里工作时,它对于处理相当大的代码库非常有用。我实际上已经考虑过最终将其集成到我们的日常构建中。

【讨论】:

  • 这个工具非常好用。我遇到了 g++ 的 -M 和 doxygen 的问题。
  • 我写了一个 python 脚本来读取 cinclude2dot 的输出并获取映射中的所有依赖项,然后进行深度优先遍历以最终输出源森林。没有任何.cc/.c/.cxx 文件的林(其中只有.h 文件)可能是多余的。
【解决方案5】:

首先,cinclude2dot.pl 是一个 perl 脚本,它分析 C/C++ 代码并生成 #include 依赖关系图作为点文件以输入到 graphviz。

http://www.flourish.org/cinclude2dot/

如果您不想走那种手动工具的道路,那么在我看来,毫无疑问的赢家是 ProFactor 称为“IncludeManager”的工具。

http://www.profactor.co.uk/includemanager.php

有免费试用版,非常棒。它是完全集成的 Visual Studio 插件,因此双击此处的某些内容可将您带到包含它的位置。

鼠标悬停工具提示为您提供所需的所有信息,它可以让您向下钻取/向上钻取、删除您不关心的整个子树、查看图表以外的表示形式、循环浏览此和那个的匹配列表,太棒了。

如果您很快,您可以在试用期结束之前重构大型项目的#include 结构。即便如此,它的成本也不高,每个许可证大约 35 美元。

就它的作用而言,它几乎是完美的。不仅#include 图表,还有共享文件的跨项目依赖关系,对构建时间的影响,网格中的详细属性,完美。

【讨论】:

  • 我已经在我的 C 项目中成功使用了 IncludeManager。我正在使用 Visual Studio 2013。
  • 有点可疑。
  • 不再在那个链接...
【解决方案6】:

好消息:redhat Source-Navigator(也可以在 Windows 上运行)。当然,编译器开关(前面提到过)具有出色的解析能力,我不确定这将如何处理 MFC、Qt 及其魔术关键字。

【讨论】:

    【解决方案7】:

    KeithB's answer 为基础,这里是 GNUmake 语法,可自动 1) 生成依赖文件,2) 使它们保持最新,3) 在你的 makefile 中使用它们:

    .dep:
        mkdir $@
    .dep/%.dep: %.c .dep
        (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
    .dep/%.dep: %.cpp .dep
        (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
    DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
    -include $(DEPEND)
    

    (确保将这些缩进更改为硬制表符。)

    【讨论】:

      【解决方案8】:
      【解决方案9】:

      Understand for C++ 应该能够帮助您:它构建了一个您可以从 Perl 访问的数据库。

      【讨论】:

      • 理解是商业的,但它是令人难以置信的 IMO。您可以免费试用。
      【解决方案10】:

      cscope (http://cscope.sourceforge.net/) 在独立的 xterm 中执行此操作,也可以在您最喜欢的编辑器中使用 - 它具有出色的 emacs 和 vi/vim 支持。

      【讨论】: