分析包含指令以解决编译单元构建缓慢的问题

9 浏览
0 Comments

分析包含指令以解决编译单元构建缓慢的问题

我经常发现文件的头部节越来越大,但从不会变小。在源文件的生命周期中,类可能已经移动和重构,很可能有很多不再需要的#include指令。保留它们只会延长编译时间并增加不必要的编译依赖。尝试找出哪些仍然需要可能会非常繁琐。

是否有一种工具可以检测多余的#include指令,并建议我可以安全删除哪些?

Lint可能可以做到这一点吗?

0
0 Comments

分析包含指令在编译过程中导致构建速度慢的原因以及解决方法

在软件开发过程中,代码文件经常会包含其他文件,以便访问其中的函数、类或变量。然而,过多的包含指令可能导致编译过程变慢,影响项目的构建速度。为了解决这个问题,我们可以使用Doxygen工具生成包含文件的依赖关系图,并通过可视化方式来查看这些依赖关系。这样可以帮助我们更好地了解哪些文件之间存在冗余的包含关系,从而优化代码的构建过程。

Doxygen是一个用于生成代码文档的工具,它可以分析源代码中的包含指令,并生成一张依赖关系图。通过查看这张图,我们可以清楚地看到文件之间的依赖关系链。例如,如果我们看到A->B->C->D这样的链条,同时又看到A->D这样的关系,那么我们就可以发现A->D之间存在冗余的包含关系。

然而,需要注意的是,这种方法并不是自动化的。我们需要通过可视化方式来逐个查看这些依赖关系图,以便发现冗余的包含关系。此外,这种方法也无法判断包含指令是否真正需要,因为间接包含的文件可能会在未来发生变化。因此,更好的方法是根据代码文件中实际使用的类/函数来确定包含指令,而不是依赖于间接包含的文件。

为了使用Doxygen生成依赖关系图,我们需要在配置文件中设置INCLUDE_GRAPH选项。配置文件中的INCLUDE_GRAPH选项可以指定生成依赖关系图的方式。

需要注意的是,对于大型项目来说,由于每个文件都会生成一个依赖关系图,所以需要逐个搜索这些图形来查找冗余的包含关系。因此,在处理大型项目时,这种方法可能会比较繁琐。

总结起来,通过使用Doxygen工具生成依赖关系图,并通过可视化方式查看文件之间的包含关系,我们可以发现冗余的包含指令,并优化代码的构建过程,从而提高项目的构建速度。

0
0 Comments

分析包含指令对翻译单元的慢速构建问题的原因和解决方法

问题的原因:

1. 代码中存在超出需求的#include指令,导致编译过程变慢。

2. 代码中存在不必要的#include指令,但是由于其他原因(例如编译错误)无法删除。

解决方法:

1. 使用cppclean工具来查找冗余的#include指令。

2. 使用include-what-you-use工具来查找冗余的#include指令,并且可以建议使用前向声明来减少#include的数量。

3. 在Eclipse CDT中使用Organize Includes功能来对#include指令进行排序,添加Eclipse认为需要但没有直接包含的头文件,并注释掉Eclipse认为不需要的头文件。但是这个功能不是完全可靠的。

4. 使用deheader工具来查找并删除不必要的#include指令。

文章内容如下:

Google的cppclean可以找到几类C++问题,现在它还可以找到多余的#include指令。

还有一个基于Clang的工具include-what-you-use,可以做到这一点。include-what-you-use甚至可以建议使用前向声明(这样就不必#include那么多),并且可以选择清理你的#include指令。

当前版本的Eclipse CDT也内置了这个功能:在源码菜单下点击Organize Includes可以对#include指令进行字母排序,添加Eclipse认为你在使用但没有直接包含的头文件,并注释掉Eclipse认为你不需要的头文件。然而,这个功能并不是100%可靠的。

我刚开始使用它。在这里看到我的笔记。

cppclean仓库已经关闭,你现在可以在这里找到它:bitbucket.org/robertmassaioli/cppclean(原始网站仍然对一些示例用法有用)

我更新了链接到一个维护的cppclean分支:github.com/myint/cppclean

include-what-you-use似乎仍在开发中,经过一段时间的停顿后,页面上发布了一些新闻(最新条目:2014/11)。

include-what-you-use项目仍然活跃。2015年6月4日发布了include-what-you-use 0.4版本。

注意cppclean似乎只在头文件中找到这些问题,而不是cpp文件,根据文档:“头文件中的不必要#include指令”。

Eclipse CDT在内部使用了Google的iwyu工具吗?

- 我没有跟上Eclipse CDT的最新发展,但我认为不是。iwyu是彻底而相对较慢的。Eclipse CDT的分析速度快(交互式),而且在我测试时较不准确。

最新的cppclean(0.13)报告了很多Konsole源代码中未使用的#include指令,但是删除任何一个都会导致编译错误。在这方面,include-what-you-use要好一些:它也有很多误报,但至少一些删除的#include确实不需要。顺便说一下,值得注意的是,include-what-you-use已经被打包到许多GNU / Linux发行版中,所以你不需要从源代码安装它(这并不简单)。该包可以使用替代名称iwyu。

哇,Eclipse内置的这个功能真的很酷!我以前不知道它的存在。我可能会将其添加到我的Eclipse文档中。

在我尝试编译其他两个在这里提到的工具失败后,我找到了这个工具:deheader,它可以在Linux Mint上直接使用。因为我还没有在这里看到它,所以我认为这可能会对某些人有所帮助。

0