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了