如何在Qt Creator中使用add_subdirectory避免源码树头文件重复显示
Qt Creator 9.0.2 CMake项目源码树重复头文件问题解决
在Qt Creator 9.0.2中使用CMake项目时,源码树会出现重复的头文件条目,导致文件组过多,难以快速定位目标文件。尝试过开启「显示简化树」,但该功能会扁平化所有目录层级,不符合需求;使用CMake的source_group分组也无法解决此问题。
最小复现示例
项目结构创建命令
mkdir Test_cmake && cd "$_" touch classA.cpp classA.hpp CMakeLists.txt mkdir Model && cd "$_" touch classB.cpp classB.hpp CMakeLists.txt
顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.13) set(TARGET "Test_Cmake") project("${TARGET}") add_executable(${TARGET}) add_subdirectory("Model") set( SOURCES classA.cpp ) set( HEADERS classA.hpp ) set( LIBS Model) target_sources( ${TARGET} PRIVATE ${SOURCES} PUBLIC ${HEADERS}) target_link_libraries(${TARGET} ${LIBS} )
Model/CMakeLists.txt
cmake_minimum_required(VERSION 3.13) set(TARGET "Model") add_library(${TARGET}) set( SOURCES classB.cpp ) set( HEADERS classB.hpp ) target_sources( ${TARGET} PRIVATE ${SOURCES} PUBLIC ${HEADERS})
解决方法
方法1:精准设置头文件可见性属性
问题根源是CMake将PUBLIC修饰的头文件同时归属于目标自身和依赖它的上层目标,导致Qt Creator重复显示。将库的暴露头文件改为INTERFACE属性,仅对链接该库的目标可见,不会在库自身的源码树中显示:
修改Model/CMakeLists.txt:
cmake_minimum_required(VERSION 3.13) set(TARGET "Model") add_library(${TARGET}) set(SOURCES classB.cpp) set(HEADERS classB.hpp) # 私有源文件仅当前库可见 target_sources(${TARGET} PRIVATE ${SOURCES}) # 接口头文件仅对链接此库的目标可见,避免重复显示 target_sources(${TARGET} INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${HEADERS}>)
方法2:调整Qt Creator的CMake显示选项
通过IDE设置过滤重复的接口文件:
- 打开Qt Creator的「工具」→「选项」→「CMake」→「项目树」
- 取消勾选「显示依赖的接口文件」选项
- 重新加载CMake项目,重复的头文件条目会消失
注意:此方法会隐藏所有依赖库的接口头文件,若需要查看这些头文件,建议优先使用方法1。
内容的提问来源于stack exchange,提问作者Adrian Maire
相关产品推荐
相关产品推荐

