CMake迭代遍历文件夹,建立过滤器

本文介绍了一种在Visual Studio中使用CMake进行文件夹遍历的方法,并展示了如何为不同类型的源文件建立相应的过滤器,以提高项目管理和编译效率。

vs下cmake遍历文件夹并建立过滤器

function(retrieve_files out_files)
    set(source_list)
    foreach(dirname ${ARGN})
        file(GLOB_RECURSE files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
			"${dirname}/*.cmake"
            "${dirname}/*.h"
            "${dirname}/*.hpp"
            "${dirname}/*.c"
            "${dirname}/*.cpp"
            "${dirname}/*.cc"            
        )
        foreach(filename ${files})
            list(APPEND source_list "${CMAKE_CURRENT_SOURCE_DIR}/${filename}")
			set(file_abs_path "${CMAKE_CURRENT_SOURCE_DIR}/${filename}")
			get_filename_component(source_path "${filename}" PATH)
            string(REPLACE "/" "\\" filter_dir "${source_path}")
            source_group("${filter_dir}" FILES "${filename}")
        endforeach()
    endforeach()
    set(${out_files} ${source_list} PARENT_SCOPE)
endfunction()
### 自动生成筛选器的 CMakeLists.txt 配置 为了实现基于文件夹结构自动生成 Visual Studio 的过滤器功能,可以通过 `source_group` 命令完成。以下是详细的说明以及一个完整的示例。 #### 自动化生成筛选器的核心方法 CMake 提供了 `source_group` 命令用于将源文件分组到特定的目录树中[^3]。通过遍历项目中的所有源文件,并按照其所在的物理路径将其分配到对应的逻辑组中,可以轻松实现自动化的筛选器配置。这种方法特别适用于复杂的项目结构,例如嵌套多个子目录的情况。 #### 示例代码 假设有一个类似于以下的文件夹结构: ``` │ CMakeLists.txt ├─src │ └─main.cpp └─lib ├─math │ ├─kalman.cpp │ └─kalman.h └─matrix ├─quat.cpp └─quat.h ``` 下面是一个完整的 `CMakeLists.txt` 文件示例,展示如何根据此文件夹结构自动生成筛选器: ```cmake # 设置最低版本要求 cmake_minimum_required(VERSION 3.10) # 定义项目名称 project(AutoFilterExample VERSION 1.0 LANGUAGES CXX) # 查找当前目录下的所有源文件 file(GLOB_RECURSE ALL_SOURCE_FILES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/*.cpp" "${PROJECT_SOURCE_DIR}/lib/*.cpp") # 将找到的源文件添加到可执行目标中 add_executable(${PROJECT_NAME} ${ALL_SOURCE_FILES}) # 使用 source_group 来按文件夹结构创建筛选器 foreach(SOURCE_FILE ${ALL_SOURCE_FILES}) # 获取相对路径作为分组依据 file(RELATIVE_PATH RELATIVE_SOURCE_FILE "${PROJECT_SOURCE_DIR}" "${SOURCE_FILE}") get_filename_component(GROUP_NAME "${RELATIVE_SOURCE_FILE}" DIRECTORY) string(REPLACE "/" "\\" GROUP_NAME_WIN_FORMAT "${GROUP_NAME}") # 转换为 Windows 格式的反斜杠 # 创建筛选器 source_group("${GROUP_NAME_WIN_FORMAT}" FILES "${SOURCE_FILE}") endforeach() ``` 以上代码实现了以下几个关键点: 1. **查找所有源文件**:利用 `file(GLOB_RECURSE ...)` 动态获取所有的 `.cpp` 和其他扩展名的文件。 2. **设置依赖关系**:通过 `CONFIGURE_DEPENDS` 参数确保当新增或删除文件时重新运行 CMake[^4]。 3. **动态分组**:对于每一个源文件,计算其相对于根目录的相对路径,并以此为基础创建筛选器。 4. **适配 Windows 环境**:由于 Visual Studio 对路径的要求不同,需将正斜杠 `/` 替换为反斜杠 `\`。 #### 关键细节解释 - **`GLOB_RECURSE`**: 这一选项允许递归扫描整个目录及其子目录内的所有匹配文件。 - **`get_filename_component(...DIRECTORY)`**: 提取文件所在目录部分,从而形成分组的基础[^4]。 - **字符串替换操作**: 在某些平台上(尤其是 Windows),Visual Studio 更倾向于使用反斜杠表示路径层次结构,因此需要进行转换处理。 #### 结果效果 在上述例子中,最终会在 Visual Studio 解决方案资源管理器里看到这样的分层显示方式: - src/main.cpp 显示于顶层节点 “src” - lib/math/kalman.cpp 列入子级节点 “lib\math” 这种布局不仅便于开发者快速定位所需修改的内容,还保持了清晰直观的整体视图呈现形式[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值