如何通过子目录CMake在Visual Studio中镜像文件夹结构
解决CMake嵌套目录下source_group生成Visual Studio一致文件夹结构的问题
问题分析
你当前的错误主要来自三点:
source_group中文件名大小写不匹配(Vulkanutils.h应为VulkanUtils.h)TREE参数指定的根目录与文件实际路径不匹配,导致CMake无法正确映射分组- 未给
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
相关产品推荐
相关产品推荐

