CMake实现Visual Studio解决方案资源管理器自动映射文件夹结构
解决CMake自动映射VS解决方案资源管理器文件夹结构的问题
我完全懂你不想逐个手动设置FOLDER属性的心情——手动维护太麻烦,而且希望VS的筛选器能直接对应实际的文件目录结构。你试过的set_property(GLOBAL PROPERTY USE_FOLDERS ON)是必要的基础配置,但它本身不会自动完成映射,还需要配合两步额外设置:
1. 让源文件自动按实际目录生成VS筛选器
如果你使用的是CMake 3.16或更高版本,这一步可以一键搞定:
set_property(GLOBAL PROPERTY USE_FOLDERS ON) # 开启自动按目录分组源文件的全局属性 set_property(GLOBAL PROPERTY SOURCE_GROUP_BY_FOLDER_DIR ON)
开启这个属性后,CMake会自动根据源文件相对于项目根目录的路径,在VS解决方案资源管理器里创建完全匹配实际结构的筛选器文件夹,无需手动编写分组规则。
如果你的CMake版本低于3.16,就需要手动实现一个分组函数:
function(auto_group_sources) foreach(source_file ${ARGN}) # 获取文件相对于当前CMakeLists目录的路径 file(RELATIVE_PATH relative_path ${CMAKE_CURRENT_SOURCE_DIR} ${source_file}) # 提取文件所在目录作为分组名 get_filename_component(group_path ${relative_path} DIRECTORY) # 把路径中的斜杠替换为VS筛选器支持的反斜杠 string(REPLACE "/" "\\" group_name ${group_path}) # 创建对应分组 source_group(${group_name} FILES ${source_file}) endforeach() endfunction() # 在添加源文件时调用该函数,例如: # auto_group_sources(${MY_PROJECT_ALL_SOURCES})
2. 自动为目标设置FOLDER属性
USE_FOLDERS只是允许目标使用FOLDER属性,但不会自动给目标分配对应目录。我们可以写一个宏,遍历所有目标并根据其所在目录自动设置:
# 为单个目标自动设置FOLDER的辅助函数 function(set_target_auto_folder target) # 获取目标的源文件根目录 get_target_property(target_root_dir ${target} SOURCE_DIR) # 计算该目录相对于项目根目录的路径 file(RELATIVE_PATH relative_dir ${CMAKE_SOURCE_DIR} ${target_root_dir}) # 给目标设置FOLDER属性 set_target_properties(${target} PROPERTIES FOLDER ${relative_dir}) endfunction() # 遍历当前及子目录的所有目标,自动分配FOLDER macro(assign_all_target_folders) # 获取当前目录下的所有目标 get_property(current_targets DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY BUILDSYSTEM_TARGETS) foreach(target ${current_targets}) set_target_auto_folder(${target}) endforeach() # 递归处理子目录 get_property(subdirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY SUBDIRECTORIES) foreach(subdir ${subdirs}) add_subdirectory(${subdir}) assign_all_target_folders() endforeach() endmacro() # 在项目根CMakeLists.txt中调用这个宏 assign_all_target_folders()
最终效果
把这些配置添加到根CMakeLists.txt后,重新生成VS解决方案:
- 所有目标会按照它们所在的目录结构,在VS解决方案资源管理器的“解决方案”节点下自动分组
- 每个目标下的源文件也会完全匹配实际的文件夹结构,以筛选器形式展示,不再是杂乱的扁平列表
内容的提问来源于stack exchange,提问作者rSir
相关产品推荐
相关产品推荐

