如何用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
相关产品推荐
相关产品推荐

