如何配置CMake触发的include-what-you-use仅检查项目自身文件
如何配置CMake触发的include-what-you-use仅检查项目自身文件
哈哈,这个问题我太有共鸣了!之前用IWYU配合CMake的时候,也被它连系统头文件的小问题都揪着不放给烦到过,后来折腾出来几个靠谱的解决方法,你可以根据自己的项目情况选:
最简单粗暴:直接让IWYU别管系统头文件
你可以在设置CMAKE_CXX_INCLUDE_WHAT_YOU_USE的时候,给IWYU附加一个参数,让它完全跳过系统头文件的检查。具体就是把原来的单行配置改成这样:set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "/path/to/include-what-you-use;-Xiwyu;--check_system_headers=0")这里的
-Xiwyu是告诉CMake:后面的参数是给IWYU的,别自己瞎处理。--check_system_headers=0就是让IWYU对系统头文件的问题睁一只眼闭一只眼。精准控制:只让IWYU检查你的项目目录
如果你的项目源码都集中在特定几个目录(比如src/和include/),可以明确告诉IWYU只盯着这些目录的文件。比如:# 先定义你的项目源码目录,多个目录用分号隔开 set(PROJECT_MY_DIRS "${PROJECT_SOURCE_DIR}/src;${PROJECT_SOURCE_DIR}/include") # 把目录格式转换成IWYU能识别的逗号分隔形式 string(REPLACE ";" "," IWYU_TARGET_DIRS "${PROJECT_MY_DIRS}") # 配置IWYU的路径和参数 set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "/path/to/include-what-you-use;-Xiwyu;--include_dirs=${IWYU_TARGET_DIRS}")这样IWYU就只会检查你指定目录里的头文件和源码,系统目录下的内容直接忽略。
最符合CMake规范:用SYSTEM标记区分头文件类型
其实CMake本身就有区分系统头文件和项目头文件的机制——在添加头文件目录时给系统/第三方目录加上SYSTEM标记。IWYU会识别这个标记,自动跳过这些目录的检查。比如:# 第三方/系统头文件目录,加SYSTEM标记 target_include_directories(MyProjectTarget SYSTEM PRIVATE "/usr/include/SDL2") # 你自己的项目头文件目录,正常添加 target_include_directories(MyProjectTarget PRIVATE "${PROJECT_SOURCE_DIR}/include")这种方法不仅能解决IWYU的问题,还能让CMake本身的编译警告也跳过系统头文件,一举两得。
备注:内容来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

