当前位置:网站首页>整理混乱的头文件,我用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构建指导
边栏推荐
- 7 RSA密码体制
- Capvision Rongying's prospectus in Hong Kong was "invalid": it was strictly questioned by the CSRC and required supplementary disclosure
- 容器环境minor gc异常频繁分析
- DataKit——真正的统一可观测性 Agent
- 最大子数组与矩阵乘法
- Use and principle of thread pool
- L1-072 scratch lottery
- Is it safe to open an account online
- 2022年国内云管平台厂商哪家好?为什么?
- How to "use" Perl modules in directories that are not in @inc- How do I 'use' a Perl module in a directory not in @INC?
猜你喜欢
The test experience "tortured" by the PMP test is worth your review
Object. Usage of keys()
Visual Studio 2019 (LocalDB)MSSQLLocalDB SQL Server 2014 数据库版本为852无法打开,此服务器支持782
leetcode:421. The maximum XOR value of two numbers in the array
Embedded software architecture design - function call
矿产行业商业供应链协同系统解决方案:构建数智化供应链平台,保障矿产资源安全供应
Transformer中position encoding实践
智慧物流园区供应链管理系统解决方案:数智化供应链赋能物流运输行业供应链新模式
利用win10计划任务程序定时自动运行jar包
~88 running people practice
随机推荐
安信证券手机版下载 网上开户安全吗
Spark 中的 Rebalance 操作以及与Repartition操作的区别
祝贺Artefact首席数据科学家张鹏飞先生荣获 Campaign Asia Tech MVP 2022
基于wifi控制的51单片机温度报警器
Unity interview questions (continuously updated)
VMware Tools和open-vm-tools的安装与使用:解决虚拟机不全屏和无法传输文件的问题
Li Kou today's question -1200 Minimum absolute difference
How to implicitly pass values when transferring forms
51 single chip microcomputer temperature alarm based on WiFi control
Go语言循环语句(第10课下)
线性时间排序
话里话外:流程图绘制初级:六大常见错误
基于check-point机制的任务状态回滚和数据分块任务
egg. JS learning notes
Is it safe for Anxin securities to open an account online? Is the account opening fee charged
Overflow: the combination of auto and Felx
利用win10计划任务程序定时自动运行jar包
建筑建材行业经销商协同系统解决方案:赋能企业构建核心竞争力
Is it safe for CITIC Securities to open an account online? Is the account opening fee charged
Hash table