C++中include-what-you-use(iwyu)去除多余头文件工具开发文档

开篇敬知乎大神~
大神首页

操作系统: Windows

所需工具: SVN、CMake、visual studio 2015以上版本、Sublime Text 3

操作步骤:

1.新建llvm文件夹,使用svn将llvm官方源码导出到该文件夹

http://llvm.org/svn/llvm-project/llvm/trunk

2.在llvm/tools下新建clang文件夹,使用svn将clang官方源码导出到该文件夹

http://llvm.org/svn/llvm-project/cfe/trunk

3.到此,已准备好了所需的源码,开始使用CMake生成项目文件

      3.1新建llvm-build文件夹(不能在llvm文件夹底下),用于存放CMake生成的项目文件




      3.2 [可选]为了减少CMake导出量,可作以下配置(以cmake-gui为例)




                         a. CMake里先将所有的打勾都取消


                         b.将所有的all改成host,意思是只针对本平台进行配置


                         c.给下面的选项打勾


                           LLVM_INCLUDE_TOOLS


                           LLVM_INCLUDE_UTILS

                           LLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD本项含义是:
                           编译llvm\tools\clang\tools\extra下的项目


                         d.将所有的MD换为MT,将MDd换为MTd




      3.3使用CMake导出vs项目文件
       PS:Cmake这个项目不是必需的,但的确可以大大方便生成项目文件,我遇到了一个问题就是Cmake不好用
        我的方法是:使用cmd命令行来生成项目文件,在命令行输入:
        C:\project\llvm-build>cmake–G ”Visual Studio 15 2017” ../llvm –Thost=x64

4.使用VS打开llvm-build/llvm.sln,选中clang项目然后生成(约1小时)。

5.将iwyu项目添加到clang项目中,一般是复制到llvm\tools\clang\tools文件夹下,这个要看iwyu的文档

https://include-what-you-use.org/downloads/include-what-you-use-0.8.src.tar.gz

6.使用Sublime Text 3编辑llvm/tools/clang/tools/CMakeLists.txt,在里面添加

add_subdirectory(include-what-you-use)

7.使用Cmake重新生成项目文件。

8.在VS中提示发生更改,重新加载一下即可。

9.在VS中生成include-what-you-use

PS:生成的时候遇见了两个小警告(TemplateSpecializationType::PrintTemplateArgumentList和TemplateSpecializationType:: TemplateArgumentListInfo),应该和打印参数有关,注释掉就OK了。

项目测试:

实例1:

创建

        a.h
        b.h
        c.h
        ttt.cpp

在命令行输入命令:

C:\project\llvm-build\bin\Debug\include-what-you-use.exe-x c++ -std=c++11 -Xiwyu –verbose=2 -Xiwyu –transitive_includes_only ttt.cpp2> iwyu.out

输出的结果将被重定向到iwyu.out文件中
输出结果

实例2:

创建foo.cpp文件
在命令行输入命令:

C:\project\llvm-build\bin\Debug\include-what-you-use.exe-x c++ -std=c++11 -Xiwyu –verbose=2 -Xiwyu –transitive_includes_only foo.cpp2> iwyu.out

输出的结果将被重定向到iwyu.out文件中
输出结果

其实,在网络中查询此开发工具过程中,发现iwyu更适合在Linux系统工作,Windows系统大大增加了编译的难度,include-what-you-use(等下直接简称为iwyu)的确是一个很有用的工具,可以自动删除不必要的#include并能生成前置声明,虽然较难上手,但一旦建立起自动化处理机制后,可以很方便的清理项目的c++文件中多余的#include。
但iwyu的主要不足是:去除头文件中多余的#include不够彻底,或者说,可以很彻底,但大部分情况下将会导致其他的文件发生编译错误。

通过跟踪其源码实现流程以及结合使用的情况来看,iwyu对于c++文件的清理仅依赖于通过单个文件的解析,并没能分析出整个项目的依赖图。这也决定了iwyu的主要使用场景是清理.cpp文件,而非.h文件,因为这样更安全。
举一个例子:
假设有all.h,里面有包含2个有用的头文件,3个没用的头文件
all.h包括#include “a.h”#include “b.h” #include “永远用不到的头文件1.h” #include “永远用不到的头文件2.h”#include “永远用不到的头文件3.h”class C{};

现在,假设项目中的A.cpp和B.cpp均包含了all.h,其中,A.cpp仅使用了"a.h"内的内容,而B.cpp仅使用了"b.h"的内容。
此时使用iwyu处理A.cpp和B.cpp,A.cpp中的#include"all.h"将被替换为#include "a.h",B.cpp中的将被替换为#include "b.h",而all.h内容并不会改动。
但我们还是希望all.h中多余的3个文件能被清理掉的,于是我们继续使用iwyu清理all.h,但很明显iwyu是不知道a.h和b.h是曾经被使用到的,于是all.h最后将变成

all.h
class C{};
all.h中所有的#include,包括#include”a.h”和#include “b.h”都被删掉了,于是项目将发生编译错误。
这个问题挺难避免的,比较折中的做法是只清理cpp文件,再根据需求自行清理h文件。但相应的清理效果就可能会大打折扣了。因为说不定就是某些无用的h文件被大量cpp文件包含才导致项目编译速度变慢的,而我们又不方便直接定位到这些#include。
所以生成项目中的各个文件的依赖关系结构是很有必要的,iwyu在这方面仍然不足,所以我觉得还是可以把工具发出来作为备用。
而对于linux下的c++项目,由于iwyu已经做得足够强大,Windows系统大大增加了编译的难度。

珍惜劳动成果,未经允许不得转载!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值