iwyu: include what you use 工具的用法

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
#include
#include
#include
 
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     // for operator<<, string

test_sample.cpp should remove these lines:
- #include   // lines 3-3
- #include   // lines 1-1
- #include   // lines 2-2

The full include-list for test_sample.cpp:
#include   // for endl, basic_ostream, cout, ostream
#include     // for operator<<, 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了

你可能感兴趣的:(ubuntu,linux,iwyu)