整理混乱的头文件,我用include what you use
摘要:使用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 https://github.com/include-what-you-use/include-what-you-use.git
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。可以参照项目主页的使用方法,来帮助自动修复。
整理混乱的头文件,我用include what you use的更多相关文章
- c++ 头文件包含问题-include&class
http://blog.csdn.net/jiajia4336/article/details/8996254 前向声明概念(forward declaration) 在程序中引入了类类型的B.在声明 ...
- Object-c 语法 - 头文件引用(@class/#import/#include)
一. Objective-C 中 #import 和 #include 的区别 预编译指令 Objective-C:#import:由gcc编译器支持 C,C++:#include 在 Objecti ...
- c语言头文件中定义全局变量的问题
c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...
- C/C++关于string.h头文件和string类
学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用s ...
- cocos2dx中使用声音引擎需要包含的头文件
1.需要包含的头文件和命名空间 #include "SimpleAudioEngine.h"using namespace CocosDenshion;
- C/C++常用头文件及函数汇总
转自: C/C++常用头文件及函数汇总 C/C++头文件一览 C #include <assert.h> //设定插入点#include <ctype.h> //字符处理#in ...
- linux常用头文件及说明
linux常用头文件及说明 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言,assert(表达式)<glib.h>:GCC.GTK,GNOM ...
- c语言头文件和源文件不在同一个目录
http://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3088688.html 从工程上讲,头文件的文件名应该与对应的源文件名相同便于维护,如果头文 ...
- 正确使用c语言中的头文件
我们在使用c编程的时候经常会遇到头文件,前段时间我自己做了个小项目的时候,也遇到了关于头文件的问题. 预处理器发现#include 指令后,就会寻找后跟的文件名并把这个文件包含的内容包含到当前文件中. ...
- sort()函数与qsort()函数及其头文件
sort()函数与qsort()函数及其头文件 sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为: ...
随机推荐
- facebook广告投放优化师
由来(一个技术的自嗨) 你以为我是个广告优化师?错,我是个java开发从事者.一开始我是想介绍某人转行去做广告投放优化师的,毕竟自己也在某出海公司待过一段时间,对于技术来说出海的核心是支付系统业务和广 ...
- Keil MDK忽略警告, 包括文件末尾空白行, 未使用等警告
首先应该了解为什么Keil MDK 会有这样的警告, 原因简单说就是C99规定了要在末尾行加回车 一. 你可以使用格式化工具对所有源文件进行一次格式化处理. 二. 在Keil MDK中查看 Build ...
- re1-100
虽然关键的判断函数和"成功"的提示也在这里,但是具体对输入flag的操作却在后面 看到对数组bufParentRead[1]开始赋值"53fc275d81",b ...
- JavaScript高级程序设计笔记06 集合引用类型
集合引用类型 1. Object(详见c08 p205) 适合存储,在应用程序间交换数据 创建实例: a. 显式构造函数 b. 字面量-->不会调用构造函数(代码更少.更有封装感) 函数:大量参 ...
- [NOIP 考前备战] 线段树刷题
备战线段树 T1 AcWing .1275. 最大数 查询最大值 + 单点修改 #include <bits/stdc++.h> #define int long long using n ...
- DP:摆动序列
问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 1. 序列中的所有数都是不大于k的正整数: 2. 序列中至少有两个数. 3. 序列中的数两两不相等: 4. 如果第i – 1个数比第i ...
- ASM字节码操作类库(打开java语言世界通往字节码世界的大门)
前言:授人以鱼不如授人以渔,应用asm的文章有很多,简单demo的也很多,那么ASM都具备哪些能力呢?如何去学习编写ASM代码呢?什么样的情景需要用到ASM呢?让我们带着这些问题阅读这篇文章吧. 这里 ...
- OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件🎈
你好,我是 Kagol. 非常高兴跟大家宣布,2023年11月30日,OpenTiny Vue 发布了 v3.12.0 . OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,10.24 ...
- 无序对的GCD
求\(\sum_{i = 1}^n \sum_{j = i+1}^n GCD(a_i, a_j)\) \(N\)为上确界,\(n\)为\(a\)数组元素个数,\(D\)为约数个数. 方法一 \(1.\ ...
- Java连接phoenix问题
这个错误的原因是找不到文件,所以要在本地配置一下hadoop的环境变量 下载 将其中hadoop 这个文件放在c盘windows下system32目录下就ok了