使用IWYU整理头文件引用

0x01 介绍

IWYU 是include what you use的首字母缩写
IWYU 使用clang分析符号的引用。是google的一个项目,它可以给出应该引用和移除
的头文件,但并不能保证 100% 是正确的(当然都是语言特性的原因)。

0x02 编译源码包

  • 安装clang
  • 检查clang的版本并下载对应版本的IWYU源码

  • 编译
    • tar xvf include-what-you-use-clang_3.4.tar.gz
    • mkdir build && cd build
    • cmake -G "Unix Makefiles" -DLLVM_PATH=/usr/lib/llvm-3.4 ../include-what-you-use-clang_3.4
    • make

0x03 举例

  • c++ 源码 mem.cc

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <fcntl.h>
    #include <signal.h>
    #include <stdio.h>
    //#include <stdlib.h>
    #include <string.h>
    #include <stdint.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <sys/user.h>
    #include <execinfo.h>

    #include <thread>
    using namespace std;

    void g()
    {
    usleep(2000);
    printf("thread one\n");
    }

    void f()
    {
    printf("thread two\n");
    }

    int main(int argc, char* argv[])
    {
    std::thread t1(f);
    std::thread t2(g);
    t1.join();
    t2.join();
    return 0;
    }
  • 检查, 注意,要使用-std=c++11, 因为这里使用c11的线程库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    dennis@dennis:~/Downloads/build$ ./include-what-you-use -std=c++11 mem.cc 

    mem.cc should add these lines:

    mem.cc should remove these lines:
    - #include <execinfo.h> // lines 11-11
    - #include <fcntl.h> // lines 1-1
    - #include <signal.h> // lines 2-2
    - #include <stdint.h> // lines 6-6
    - #include <string.h> // lines 5-5
    - #include <sys/mman.h> // lines 7-7
    - #include <sys/stat.h> // lines 8-8
    - #include <sys/user.h> // lines 10-10

    The full include-list for mem.cc:
    #include <stdio.h> // for printf
    #include <unistd.h> // for usleep
    #include <thread> // for thread
    ---
  • 修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //#include <fcntl.h>
    //#include <signal.h>
    #include <stdio.h>
    //#include <stdlib.h>
    //#include <string.h>
    //#include <stdint.h>
    //#include <sys/mman.h>
    //#include <sys/stat.h>
    #include <unistd.h>
    //#include <sys/user.h>
    //#include <execinfo.h>
  • 再次检查,显示已正确引用或前向声明

    1
    2
    3
    dennis@dennis:~/Downloads/build$ ./include-what-you-use -std=c++11 mem.cc 

    (mem.cc has correct #includes/fwd-decls)

0x04 参考