当前位置:网站首页>整理混乱的头文件,我用include what you use
整理混乱的头文件,我用include what you use
2022-07-04 15:33:00 【华为云开发者联盟】
摘要:使用include-what-you-use(iwyu/IWYU)清理冗余头文件,补充必要头文件。
本文分享自华为云社区《用include what you use拯救混乱的头文件》,作者: 村头树下 。
背景
面对大型C/C++项目的时候,混乱的头文件引用,经常会有一种剪不断理还乱的感觉。长年累月的项目迭代,需求更新。导致头文件未能及时随着代码的变动而更新,成为了冗余的负担。这会增加整体项目的编译时间。如果没有一个工具来帮助我整理这些头文件,我是绝对不会动一丝整改他们的想法。幸运的是,有一个工具可以满足我们的要求–include what you use.
简介
在各种C/C++编码规范中,一般都会提到几点:
禁止包含用不到的头文件
用不到的头文件被包含的同时,引入了不必要的依赖,增加了模块之间的耦合度,只要该头文件修改,代码就会重新编译。
头文件应该自包含
如果一个文件包含某个头文件。想要正常工作,还必须包含另外一个头文件,这会增加使用的负担。
所以这也是整理头文件的意义。
这也是使用include-what-you-use(下称IWYU)的初衷。
安装
附上此项目的主页
https://github.com/include-what-you-use/include-what-you-use
IWYU依赖Clang,而且它针对Clang的各个版本都有自己对应的版本。所以在安装IWYU的时候,首先需确定你的Clang是什么版本。由于本人之前未曾安装过Clang,所以首先要安装Clang.
Clang的安装
建议直接源码编译,减少符号不兼容等奇怪的错误
克隆llvm仓库
git clone https://github.com/llvm/llvm-project.git
切到想要编译的llvm版本
cd llvm-project
git checkout llvmorg-14.0.0
构建LLVM和Clang
cd llvm-project
mkdir build && cd build
cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release -G “Unix Makefiles” …/llvm
make -j48
IWYU安装
克隆IWYU仓库
git clone GitHub - include-what-you-use/include-what-you-use: A tool for use with clang to analyze #includes in C and C++ source files
cd include-what-you-use
切换到与clang对应的分支,由于刚才安装的是14.0的版本,因此这里也切换到对应版本
git checkeout clang_14
在IWYU上一层创建文件夹build
mkdir build && cd build
cmake -G “Unix Makefiles” -DCMAKE_PREFIX_PATH=…/llvm/llvm-project/llvm/ …/include-what-you-use/
CMAKE_PREFIX_PATH指向刚才构建的llvm目录。如果构建成功,你会看到
开始编译IWYU
cd …/include-what-you-use/
make -j48
编译成功
如果希望更方便的使用iwyu,可以将其bin加入环境变量中,我是创建了一个软链接到/usr/bin目录下
ln -s /the/path/of/include-what-you-use/bin/include-what-you-use /usr/bin/iwyu
如果一切妥当,就可以用iwyu -v来检查是否安装成功了
使用
这里介绍一下在Clion环境下,如何使用IWYU
打开Clion->File->Setting->Build,Execution,Deployment页面
设置编译器
在官方文档中,介绍使用IWYU的时候,使用Clang作为编译器。通过亲自实践发现,在14.0版本下,Gcc 7.3.1也是可以使用IWYU的。
在Toolchains中设置Clang的路径,由于我Gcc也可以运行,所以并没有更改设置编译选项
->Cmake设置页面。
新建一个编译模板名为Debug-iwyu,重点是在Cmake options中添加 -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=iwyux 其中iwyu为你环境中实际include-what-you-use可执行文件的路径编译项目
在编译项目的界面选择刚刚创建的编译模板Debug-iwyu
OK,一切准备就绪,就可以开始编译了。结果处理
这里举了一个很简单的例子,main.cpp包含了三个用不到的头文件
然后iwyu在编译的过程中会提醒我们这三个头文件应该被移除
但是真实的大型项目中,肯定会有很多的提醒,一个一个去手动修改。依然是个机械的苦力活,所以在iwyu项目中,提供了一个可以辅助自动修复的脚本fix_includes.py。可以参照项目主页的使用方法,来帮助自动修复。
- [1] IWYU主页
- [2] Clang构建指导
边栏推荐
- Linear time sequencing
- Solution du système de gestion de la chaîne d'approvisionnement du parc logistique intelligent
- Maximum subarray and matrix multiplication
- Smart Logistics Park supply chain management system solution: digital intelligent supply chain enables a new supply chain model for the logistics transportation industry
- go-micro教程 — 第二章 go-micro v3 使用Gin、Etcd
- leetcode:421. 数组中两个数的最大异或值
- Congratulations to Mr. Zhang Pengfei, chief data scientist of artefact, for winning the campaign Asia tech MVP 2022
- Learn more about the basic situation of 2022pmp examination
- 如何实现一个延时队列 ?
- 智慧物流园区供应链管理系统解决方案:数智化供应链赋能物流运输行业供应链新模式
猜你喜欢
C# 更加优质的操作MongoDB数据库
基于wifi控制的51单片机温度报警器
第十八届IET交直流输电国际会议(ACDC2022)于线上成功举办
overflow:auto与felx结合的用法
NFT liquidity market security issues occur frequently - Analysis of the black incident of NFT trading platform quixotic
Capvision Rongying's prospectus in Hong Kong was "invalid": it was strictly questioned by the CSRC and required supplementary disclosure
World Environment Day | Chow Tai Fook serves wholeheartedly to promote carbon reduction and environmental protection
How to choose one plus 10 pro and iPhone 13?
世界环境日 | 周大福用心服务推动减碳环保
【云原生】服务网格是什么“格”?
随机推荐
Analysis of abnormal frequency of minor GC in container environment
Object. Usage of keys()
跳跃表实例
The winning rate against people is 84%, and deepmind AI has reached the level of human experts in army chess for the first time
被PMP考试“折磨”出来的考试心得,值得你一览
Sequence diagram data modeling and industrial chain analysis
Visual studio 2019 (localdb) mssqllocaldb SQL Server 2014 database version is 852 and cannot be opened. This server supports 782
Go language loop statement (under Lesson 10)
安信证券属于什么档次 开户安全吗
Readis configuration and optimization of NoSQL (final chapter)
Can you really use MySQL explain?
tp配置多数据库
照明行业S2B2B解决方案:高效赋能产业供应链,提升企业经济效益
leetcode刷题目录总结
网页游戏引擎
智慧物流園區供應鏈管理系統解决方案:數智化供應鏈賦能物流運輸行業供應鏈新模式
tx.origin安全问题总结
线性时间排序
Task state rollback and data blocking tasks based on check point mechanism
How can programmers improve the speed of code writing?