“深度”头部依赖分析
Posted
技术标签:
【中文标题】“深度”头部依赖分析【英文标题】:"Deep" header dependency analysis 【发布时间】:2011-08-18 19:20:38 【问题描述】:我从事一个中型 C/C++ 项目,我已经应用了 Doxygen+Graphviz。它的标题图很有用,但它们仅显示基于#include
的关系。我有兴趣找到一个(最好是基于 linux 的)工具,它不仅基于 #include
,而且基于实际符号使用来分析文件依赖关系。例如,这样的工具不仅会显示a.cpp
包括b.h
,而且a.cpp
会使用SomeClass
,它在c.h
中声明的b.h
包含。它还可以建议可以修剪的标头包含。
【问题讨论】:
【参考方案1】:我之前使用过Include What You Use,效果非常好。它使用 Clang 解析 C++ 代码并建议转发声明以添加和头文件以删除。
一个缺点是它对代码的布局做出假设 - 基本上是 Google 编码标准。因此,如果您有一个名为SomeClass.cpp
的文件,它只会查看SomeFile.h
。建议还包括使用项目根目录的完整路径(所以#include "src/SomeClass.h"
而不是#include "SomeClass.h"
)。最后我还是把我的代码改成了这个约定,因为它避免了歧义,但是如果你尝试的话,它需要提醒一下。
通常您可以设置CC=include-what-you-use
并重新构建以获得结果 - 它使用所有clang 机器来解析-I
包含参数。有一个 python 程序使用结果自动更新你的#include 行。
编辑:
另一个不那么复杂但设置更简单并且可以建议删除#include
s 的工具是deheader。它通过将 C++ 文件复制到临时位置、删除 #include
并重新编译来工作。如果重新编译有效,那么删除该头文件是安全的。它不会建议前向声明或任何花哨的东西,但它可以减少实现文件中不必要的包含行。
【讨论】:
看起来很有希望,尽管它没有要安装的二进制文件确实很痛苦。当我开始编译 llvm 时,它把我的硬盘填满了。 @Reinderien llvm+clang 的检出和构建“仅”在 1Gb 左右,记得将 --enable-optimized 传递给配置脚本。调试版本将使您回到 4Gb 左右。 我终于能够构建 IWYU - 是的,它体积庞大、臃肿等等,但总比没有好。我也来看看deheader。谢谢以上是关于“深度”头部依赖分析的主要内容,如果未能解决你的问题,请参考以下文章