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

如何通过子目录CMake在Visual Studio中镜像文件夹结构

解决CMake嵌套目录下source_group生成Visual Studio一致文件夹结构的问题

问题分析

你当前的错误主要来自三点:

  1. source_group中文件名大小写不匹配(Vulkanutils.h应为VulkanUtils.h)
  2. TREE参数指定的根目录与文件实际路径不匹配,导致CMake无法正确映射分组
  3. 未给src目录下的文件配置source_group,它们会默认归入VS的默认分组而非对应磁盘文件夹

另外明确:source_group完全可以在嵌套目录的CMakeLists.txt中使用,无需全部放在根目录,完全符合每个文件夹一个CMakeLists的最佳实践。

修改后的各CMakeLists.txt内容

QPV/CMakeLists.txt

保持原有配置即可,确保全局启用文件夹功能:

project(QPV VERSION 0.1)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
add_subdirectory(src)
# GLFW stuff
# Vulkan stuff

QPV/src/CMakeLists.txt

替换原include_directories为更规范的target_include_directories,并为当前目录文件配置source_group以匹配磁盘结构:

add_executable(QPV
    main.cpp
    VulkanRenderer.h
    VulkanRenderer.cpp
)

# 为目标添加包含目录,替代全局include_directories更符合现代CMake规范
target_include_directories(QPV PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# 将当前目录的文件映射到VS中与磁盘一致的分组
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" FILES
    main.cpp
    VulkanRenderer.h
    VulkanRenderer.cpp
)

add_subdirectory(utils)

QPV/src/utils/CMakeLists.txt

修正文件名错误,调整source_group的TREE参数以正确映射到磁盘路径:

target_sources(QPV PUBLIC
    VulkanUtils.h
    VulkanUtils.cpp
)

target_include_directories(QPV PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# 将utils目录的文件映射到VS中src/utils的分组下
# TREE指定根目录为项目的src文件夹,FILES使用相对于该根的路径
source_group(TREE "${CMAKE_SOURCE_DIR}/src" FILES
    utils/VulkanUtils.h
    utils/VulkanUtils.cpp
)

原理说明

  • TREE参数指定分组的根目录,CMake会根据文件相对于该根的路径自动生成对应的嵌套文件夹结构
  • 在子目录中使用source_group时,只需确保TREE和FILES的路径对应关系正确,就能让VS显示与磁盘完全一致的目录结构
  • 无需将utils设为独立库,通过target_sources直接将文件添加到主可执行目标中,同时通过source_group整理VS中的显示结构

内容的提问来源于stack exchange,提问作者Tare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:05:35