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

如何用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(更稳妥)

如果你的项目需要长期维护、文件结构会频繁变动,推荐用这种更规范的方式:

  1. 在根CMakeLists.txt里添加:
add_subdirectory(source)
  1. 在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)
  1. 以此类推,每个子目录都创建自己的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:53