如何用CMake递归遍历多级子目录并纳入所有CPP文件用于编译?
递归收集所有子目录CPP文件的CMake方案
嘿,这个需求我在项目里经常碰到,给你分享两种实用的解决思路,适配不同场景:
方法一:用file(GLOB_RECURSE)快速收集
这是最直接的方式,一行命令就能递归扫遍所有子目录的.cpp文件:
# 递归查找source目录下所有层级的.cpp文件 file(GLOB_RECURSE ALL_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/source/**/*.cpp" ) # 将收集到的所有文件添加到目标 target_sources(voxel-cone-tracing PUBLIC ${ALL_SOURCE_FILES})
注意事项
- 这个命令不会自动检测新增的文件:如果之后你在子目录里加了新的
.cpp,必须手动重新运行CMake配置(比如cmake ..),否则编译时不会包含新文件。 - 尽量精准匹配路径:避免扫到源码目录外的无关文件(比如build目录里的临时文件),所以路径最好限定在
source目录下。
方法二:手动维护子目录CMakeLists.txt(更稳妥)
如果你的项目需要长期维护、文件结构会频繁变动,推荐用这种更规范的方式:
- 在根CMakeLists.txt里添加:
add_subdirectory(source)
- 在
source/CMakeLists.txt里,包含各个子目录并添加当前目录的源码:
# 包含下一级子目录 add_subdirectory(Graphics) add_subdirectory(math) add_subdirectory(network) # 添加source目录下的顶层cpp文件(如果有的话) target_sources(voxel-cone-tracing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/xxx.cpp)
- 以此类推,每个子目录都创建自己的
CMakeLists.txt,比如source/Graphics/CMakeLists.txt:
add_subdirectory(Camera) # 添加当前Graphics目录下的cpp文件 target_sources(voxel-cone-tracing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/graphics_core.cpp)
source/Graphics/Camera/CMakeLists.txt:
add_subdirectory(Orthographic) target_sources(voxel-cone-tracing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/camera_base.cpp)
这种方式的优势是:
- 新增文件时,只需要修改对应子目录的
CMakeLists.txt,不需要重新跑整个CMake配置(make会自动检测CMakeLists.txt的变动并触发重新配置)。 - 对文件的控制权更强,能精准控制哪些文件被编译,避免意外包含无关文件。
两种方法怎么选?
- 快速原型、临时项目:选方法一,省心省力。
- 大型项目、长期维护:选方法二,结构清晰,可维护性更高。
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

