使用 include-what-you-use 检测冗余头文件

2023-05-16

include-what-you-use 可以很方便的检测未使用的头文件,使用的时候绕了点路,google后解决,记录一下。

###1、安装clang
ubuntu下直接apt-get 安装就行了。需要注意的是,我的机器上安装clang3.8 后有问题,装了clang3.4后一切正常。暂不研究原因了,先用起来再说。

###2、切换编译器到clang

sudo update-alternatives --config cc
sudo update-alternatives --config c++

###3、编译 include-what-you-use
参考官方文档就行,没有任何错误。

###4、可以开始玩了 (参考的贴子)

  • 写个CMakeLists.txt
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
add_executable(hello main.cc)

find_program(iwyu_path NAMES include-what-you-use iwyu)
if(NOT iwyu_path)
  message(FATAL_ERROR "Could not find the program include-what-you-use")
else()
  set_property(TARGET hello PROPERTY CXX_INCLUDE_WHAT_YOU_USE ${iwyu_path})
endif()
  • 写个源码main.cc
#include <iostream>
#include <vector>

int main() {
  std::cout << "Hello World!" << std::endl;
  return 0;
}
  • 跑跑试试
user@ubuntu:/tmp$ ls ~/hello
CMakeLists.txt  main.cc
user@ubuntu:/tmp$ mkdir /tmp/build
user@ubuntu:/tmp$ cd /tmp/build
user@ubuntu:/tmp/build$ ~/cmake-3.3.0-rc2-Linux-x86_64/bin/cmake ~/hello
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
user@ubuntu:/tmp/build$ make
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/main.cc.o
Warning: include-what-you-use reported diagnostics:

/home/user/hello/main.cc should add these lines:

/home/user/hello/main.cc should remove these lines:
- #include <vector>  // lines 2-2

The full include-list for /home/user/hello/main.cc:
#include <iostream>  // for operator<<, basic_ostream, cout, endl, ostream
---

[100%] Linking CXX executable hello
[100%] Built target hello
user@ubuntu:/tmp/build$ ./hello 
Hello World!
user@ubuntu:/tmp/build$

###5、改进一下CMakeLists
上面的CMakeLists不太适合产品使用,因为打印太多了,可以在需要的时候再打开include-what-you-use。

cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
add_executable(hello main.cc)

if (ENABLE_IWYU)
  find_program(iwyu_path NAMES include-what-you-use iwyu)
  if(NOT iwyu_path)
    message(FATAL_ERROR "Could not find the program include-what-you-use")
  else()
    set_property(TARGET hello PROPERTY CXX_INCLUDE_WHAT_YOU_USE ${iwyu_path})
  endif()
endif()

用法:

cmake . -DENABLE_IWYU=ON
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 include-what-you-use 检测冗余头文件 的相关文章

  • PHP 中的绝对(或相对?)路径

    抱歉问这个问题 因为之前可能已经回答过很多次了 但我的问题有点不同 我有像树一样 var www path to my app index php b php inc include php 我正在从index php访问inc inclu
  • “未定义的函数引用”错误

    我在使用标头编译一些文件时遇到一些问题 这是我的代码的细分 file1 c include header h int main func1 return 0 file2 c include header h void func1 funct
  • 预处理器愚蠢的做法(对 #include 进行字符串化)

    注意 这个问题与 OpenCL 本身无关 请检查最后一段以获取我的问题的简洁陈述 但提供一些背景 我正在编写一些使用 OpenCL 的 C 代码 我喜欢将 OpenCL 内核的源代码保存在自己的文件中 以便于编码和维护 而不是直接将源代码作
  • rsync 排除目录但包含子目录

    我正在尝试使用 rsync 将项目复制到我的服务器 我的子目录中有项目特定的安装脚本 项目 规格 安装 project1 我想做的就是排除其中的所有内容项目 规格目录 但项目特定的安装目录 项目 规格 安装 project1 rsync a
  • 可以拆分PHP配置文件php.ini吗?

    任何使用 php 的人都知道 php ini 是一个大文件 当您需要更改 ssh 时可能会让人头疼 例如我可以使用更改 nginx confinclude指令将启用站点的目录下的所有文件加载到主 nginx conf 中 所以我的问题很简单
  • jQuery/JavaScript - 拥有大量小 .js 文件时的性能问题?

    我有一个包含大量引用的 js 文件的网站 这些是相当小的文件 但我想将我的方法按主题 功能分开 将所有方法保存在一个 js 文件中是否更好 或者拥有许多 20 30 个小文件都只包含一些行没有问题 无论如何 将它们分开进行开发 但您应该考虑
  • 使用 php include 标题、导航和其他元素时的良好做法?

    我不知道专业的网页设计师通常如何分隔这些元素 像这样 或者就像这样 或者只是将我想要重复的所有元素放在一起 我应该在这些元素中使用 php 或 html 扩展吗 头部 导航等 我该怎么办
  • jade/pug 是否可以在 include 语句中使用变量?

    我正在开发 Nodejs 应用程序 但我对 include 语句有疑问 当我像这样使用它时它会起作用 include mixins root pug 但是可以在包含中使用变量吗 这些都不起作用 include process env MIX
  • 有条件包含在 linq to 实体中?

    我觉得以下应该是可能的 我只是不确定采取什么方法 我想做的是使用 include 方法来塑造我的结果 即定义沿对象图遍历多远 但是 我希望这种遍历是有条件的 something like dealerships include d gt d
  • PHP:可以包含 file_exists() 说不存在的文件

    在我的脚本中 我设置了包含路径 以便应用程序的另一部分也可以包含文件 检查文件是否存在 然后包含它 但是 在我设置包含路径后 file exists 报告该文件不存在 但我仍然可以包含相同的文件
  • 记录 C 中“.h”文件使用模式的良好参考资料是什么? [复制]

    这个问题在这里已经有答案了 C 接口和实现 展示了一些有趣的数据结构使用模式 但我确信还有其他模式 http www amazon com Interfaces Implementations Techniques Addison Wesl
  • 实体框架代码优先 - 多对多 - 包括条件

    我有两个实体Store and Catalog 使用流畅的 Api 建立多对多关系 我想通过以下方式获得商店id所有目录的状态都等于 已发布 下面我尝试编写以下查询 但没有得到预期的结果 var store context Stores I
  • 如何通过 CMake 查找特定/本地文件

    我对本地安装的库有疑问 在我的项目中有 xmlrpc 0 7 library myproject xmlrpc 0 7 src 如果没有找到 我希望 CMake 使用本地 xmlrpc 0 7 目录进行回退 有两个问题 第一个问题 find
  • <%@ page pageEncoding="UTF-8"%> 从另一个 jsp 包含时被忽略

    我有代码 现在在github https github com Utumno ted2012 tree GitHub2 WebContent WEB INF jsp include like my jsp 通用 jsp 我所有的 jsp 或
  • C++ 仅标头包含模式

    我想在 hpp 中编写代码 而不将 h 和 cpp 分开 我做到了 我仅将 cpp 用于静态类字段定义 我不想手动编写 include 如果可能的话 我使用前向声明 我的每个 hpp 文件都包含 pragma 一次 但是 当我的项目增长到
  • 将一个 SVG 包含在另一个 SVG 中

    是否可以将一个 SVG 包含在另一个 SVG 中without光栅化效果 我试过这个
  • 编译器无法识别我的 C++ 类 - 循环依赖

    有这个基类 Core hpp ifndef C3 CORE HPP define C3 CORE HPP include
  • 本地#includes

    有没有某种方法可以在本地 include 标准内容 一次针对一个函数 一个类等 而不是全局的 举一个非常简单的例子 人们可能想使用 std string 但它只在一个类中需要 并且您不希望它的开销无处不在 而不是制作 include本地 您
  • C++ 类,其基类和循环包含 [重复]

    这个问题在这里已经有答案了 文件 1 foo h ifndef FOO H define FOO H include baseclass h include bar h class Bar class Foo public baseclas
  • cpp:延迟 #include 直到第二遍

    在编译之前 我通过 C 预处理器运行源文件两次 并且我想将 include 指令延迟到第二次通过 直觉上 我尝试了这个 但它不起作用 include

随机推荐

  • 从操作系统漫谈GOLang GPM模型

    前言 本文从操作系统谈起 xff0c 简单介绍操作系统基本知识 xff0c 引出进程 线程调度的基本原理和基本模型 xff0c 然后从0到1设计Golang调度器 xff0c 通过方案的逐步演进升级 xff0c 可以了解到GPM模型设计理念
  • 卡尔曼滤波经典讲解,C++算法实现

    请移步跳转文章排版更加清晰 在学习卡尔曼滤波器之前 xff0c 首先看看为什么叫 卡尔曼 跟其他著名的理论 xff08 例如傅立叶变换 xff0c 泰勒级数等等 xff09 一样 xff0c 卡尔曼也是一个人的名字 xff0c 而跟他们不同
  • 解决linux不能安装g++问题

    问题描述 xff1a Ubuntu如何通过重新安装G 43 43 编译器 xff0c 修复不能安装使用g 43 43 的问题 我刚安装的Ubuntu 14 10的g 43 43 编译器不能使用 xff0c 用sudo apt get ins
  • MySQL系列之源码浅析

    源码才是王道 真正的高手从来不是临场发挥 xff0c 随机应变是外人看来的错觉 1 主函数sql mysqld cc中 xff0c 代码如下 xff1a span class hljs keyword int span main span
  • 卡尔曼算法精讲与C++实现

    在学习卡尔曼滤波器之前 xff0c 首先看看为什么叫 卡尔曼 跟其他著名的理论 xff08 例如傅立叶变换 xff0c 泰勒级数等等 xff09 一样 xff0c 卡尔曼也是一个人的名字 xff0c 而跟他们不同的是 xff0c 他是个现代
  • 腾讯后端面试经验

    终于等来腾讯的面试 4 3号 机试 机试包括选择 xff08 30多 xff09 简答 xff08 2题 xff09 编程 xff08 2 xff09 选择和简答编程分别一小时 xff0c 选择题考的比较广 xff0c 概率 Linux 操
  • Springboot整合摘要式(Digest)身份认证

    百度下来关于springboot整合摘要式省份认证的帖子基本都是说原理的 xff0c 很少有直接的demo xff0c 前些天找到了一个博主写的demo xff0c 但是我只是截图了忘记了博主的地址很抱歉了 下面直接上代码截图 xff1a
  • kalibr相机内参标定优化过程和原理

    在估计出内参之后 xff0c 会进行优化迭代操作 如果是多相机标定 xff0c 在完成内参标定的同时 xff0c 也会完成具有交叉视野相机外参的的标定 初始估计步骤也会进行多相机基线距离的估计 xff0c 用作后续的迭代优化 优化过程如下
  • Curl多线程并发任务实例函数

    function curl post3 url arrs flen for i 61 0 i lt flen i 43 43 foreach arrs i as k 61 gt v tmp str 61 k 34 61 34 v 34 am
  • Linux下原子操作(信号量 自旋锁)的实现原理和底层代码分析

    csdn越改版 xff0c 越丑 开始我们的主题 xff1a Linux下原子操作 xff08 信号量 自旋锁 xff09 的实现原理和底层代码分析 2017年8月27日12 47 02 1 何为原子操作 xff1f 原子操作是什么 xff
  • Linux下用c语言实现发送http请求

    前言 在linux下 xff0c 使用socket进行编程 xff0c 需要到服务器上进行获取数据 xff0c 服务器使用的php编程 xff0c 需要使用http的方式进行获取数据 代码 span class hljs preproces
  • VSCode 的C++编译

    0 参考文档 0 1 官方参考 由于C 43 43 在不同平台上编译使用的编译器不同 xff0c 所以我们先将官网针对不同平台的编译文档摘录出来 xff0c 以便大家参考 xff1a 0 0 1 Linux平台使用GCC 参考 xff1a
  • STM32在子函数中的局部变量数组利用DMA发送无法正确发送数据的问题

    现象 xff1a 在子函数中 xff0c 定义了一个局部变量sendbuf 8 61 1 2 3 4 5 6 7 8 xff0c 然后分别利用普通串口发送函数发送可以正常发送和利用DMA发送 xff0c 并利用串口调试助手查看 xff0c
  • 如何使用Qt插件在Qt中进行ROS开发

    一 前言 本文介绍一种Qt下进行ROS开发的完美方案 xff0c 使用的是ros industrial的Levi Armstrong在2015年12月开发的一个Qt插件ros qtc plugin xff0c 这个插件使得Qt 新建项目 和
  • MN316_OPEN(NBIOT)物联网模块环境搭建

    因为项目的需要 这里要使用NBIOT 踩了一些坑 这里总结一下 编译 官方给的SDK如下 按照说明 在该目录下直接运行如下指令 34 build bat dlvs h0 demo 34 即可成功编译 但是我编译的时候不成功 报错如下 最后发
  • 《学习STL》-1.STL简介

    引言 当你C 43 43 入门后 xff0c 学了些C 43 43 编程规则 xff0c 正如 C 43 43 Primer 里的内容 xff0c 你知道C 43 43 里面的基本数据类型 循环 判断 函数 类 模板等 这阶段你的确会编写一
  • linux查看大小端命令

    Byte Order Litter Endian 小端模式 xff0c 绝大部分机器都是小端模式
  • 星网宇达利用NTRIPClient连接千寻服务器获取差分定位数据

    硬件设备 xff1a 星网宇达XW GI5610 软件设备 xff1a QXNTRIPClient 连接方式 xff1a 星网宇达RTK RS232连接电脑串口 打开QXNTRIPClient xff0c 连接千寻服务器 接收下发RTK数据
  • Ubuntu20.04 安装 mNetAssist

    安装环境 xff1a Ubuntu20 04安装包 xff1a mNetAssist release amd64 deb 安装与运行 span class token function sudo span span class token
  • 使用 include-what-you-use 检测冗余头文件

    include what you use 可以很方便的检测未使用的头文件 xff0c 使用的时候绕了点路 xff0c google后解决 xff0c 记录一下 1 安装clang ubuntu下直接apt get 安装就行了 需要注意的是