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

如何用CMakeLists.txt批量编译单个cpp为对应名称的可执行文件

CMake批量编译单个cpp为同名可执行文件

问题

我有多个带main函数的cpp文件,想要按如下模式逐个编译为同名可执行文件:

add_executable(algorithm1 algorithm1.cpp)
add_executable(algorithm2 algorithm2.cpp)
...
add_executable(findFile findFile.cpp)

希望用更简洁的方式实现批量处理,避免重复编写相似语句,同时新增cpp文件时无需修改CMakeLists.txt就能自动编译,CMake是否支持这种类似Makefile的用法?

解决方案

基础批量实现(需重新运行CMake更新文件列表)

使用file(GLOB)获取所有cpp文件,再通过循环生成对应可执行文件:

# 获取当前目录下所有.cpp文件
file(GLOB CPP_SOURCES "*.cpp")

# 遍历每个源文件
foreach(SOURCE_FILE ${CPP_SOURCES})
    # 提取不带后缀的文件名作为可执行文件名称
    get_filename_component(EXECUTABLE_NAME ${SOURCE_FILE} NAME_WE)
    # 创建可执行文件目标
    add_executable(${EXECUTABLE_NAME} ${SOURCE_FILE})
endforeach()
  • 首次配置CMake时会收集所有匹配的cpp文件,后续新增文件需要重新执行cmake命令来更新构建目标。

自动检测新增文件(无需手动重新运行CMake)

如果希望新增文件后直接构建就能自动编译,可使用CONFIGURE_DEPENDS参数让CMake在每次构建时重新扫描文件:

# 让CMake在构建时重新扫描文件列表
file(GLOB CPP_SOURCES CONFIGURE_DEPENDS "*.cpp")

foreach(SOURCE_FILE ${CPP_SOURCES})
    get_filename_component(EXECUTABLE_NAME ${SOURCE_FILE} NAME_WE)
    add_executable(${EXECUTABLE_NAME} ${SOURCE_FILE})
endforeach()

添加CONFIGURE_DEPENDS后,每次执行make/ninja等构建命令时,CMake会自动检查文件变化,新增的cpp文件会被自动加入构建目标,无需手动修改CMakeLists.txt或重新运行cmake。

注意事项

  • CMake官方文档提到,file(GLOB)在正式项目中需谨慎使用,因为默认情况下CMake不会自动感知文件增减,CONFIGURE_DEPENDS可解决这个问题,但会略微增加构建前的扫描开销。
  • 若需要排除特定cpp文件,可在获取文件列表后用list(REMOVE_ITEM)移除:
    list(REMOVE_ITEM CPP_SOURCES "不需要编译的文件.cpp")
    

内容的提问来源于stack exchange,提问作者Troskyvs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:16:29