iwyu: include what you use 工具的用法

文章介绍了如何在Ubuntu20环境下安装并使用iwyu工具,该工具能帮助用户优化C++代码的头文件包含,提供添加和删除头文件的建议。通过修改Makefile,将编译器替换为iwyu,可以检查并改进源代码的头文件依赖。文章还提到了当编译路径不包含特定库时,可能出现的问题及其解决方法。
摘要由CSDN通过智能技术生成

iwyu: include what you use 工具的用法

----------------------------------------------------------------
author: hjjdebug
date:   2023年 06月 07日 星期三 09:06:21 CST
----------------------------------------------------------------

1. 安装 ubuntu20 下:
$sudo apt install iwyu

验证:
$which iwyu
/bin/iwyu

$iwyu --version
include-what-you-use 0.12 based on clang version 9.0.1-10

$iwyu --help
....

2. 使用:
在使用g++ 或者 gcc 或者 clang 的地方,换上iwyu 即可.

3. 举例:

3.1 源文件 test_sample.cpp

$ cat test_sample.cpp
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
 
int main(int argc, char* argv[])
{
    std::string tmpstr = "test";
    std::cout << tmpstr << std::endl;
    return 0;
}

3.2 Makefile

$ cat Makefile
#CXX=/usr/bin/clang++
# ubuntu 下可以使用g++
CXX=g++

#这个包含变量,用以消除找不到stddef.h的错误
INC=/usr/lib/gcc/x86_64-linux-gnu/9/include/
 
TARGET = test
OBJS = test_sample.o
 
$(TARGET) : $(OBJS)
    $(CXX) $(OBJS) -I $(INC) -o $@

test_sample.o : test_sample.cpp
    $(CXX)  -I $(INC) -c -o $@ $<
 
clean:
    @rm -rf $(TARGET) $(OBJS)
 
.PHONY: clean

3.3 使用
直接用make 就是普通的编译命令
$ make
g++  -I /usr/lib/gcc/x86_64-linux-gnu/9/include/ -c -o test_sample.o test_sample.cpp
g++ test_sample.o -I /usr/lib/gcc/x86_64-linux-gnu/9/include/ -o test

$ make
make: 'test' is up to date.

修改CXX变量使使用 iwyu 就给出了包含头文件的建议
$ make clean
$ make CXX=iwyu
iwyu  -I /usr/lib/gcc/x86_64-linux-gnu/9/include/ -c -o test_sample.o test_sample.cpp

test_sample.cpp should add these lines:
#include <string>    // for operator<<, string

test_sample.cpp should remove these lines:
- #include <math.h>  // lines 3-3
- #include <stdio.h>  // lines 1-1
- #include <string.h>  // lines 2-2

The full include-list for test_sample.cpp:
#include <iostream>  // for endl, basic_ostream, cout, ostream
#include <string>    // for operator<<, string
---

按它的建议,仅需要包含<iostream> <string> 即可.
实测, 仅需要包含<iostream>即可,说明<iostream>中也包含了<string>,也不要太迷恋它.
但它给出了该头文件中包含了那些重要声明, 还是有很好的信息.


4. 补充说明.
如果编译不包含 /usr/lib/gcc/x86_64-linux-gnu/9/include/ 路径, g++编译没有问题,
但iwyu 会报   'stddef.h' file not found
这说明 g++ 的搜索的路径比 iwyu 搜索的路径多.
我用strace 跟踪了一下, 发现g++ 从/usr/lib/gcc/x86_64-linux-gnu/9/include/下找到了stddef.h
所以我明确指定了这个包含路径, 则iwyu 也能找到stddef.h了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值