You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:15:56