CMake收集可执行文件列表并创建批量运行目标失败求助
问题解决:CMake收集可执行文件并批量运行
核心问题分析
报错的根源有三点:
- 自定义
collect函数中变量作用域处理错误,导致全局列表EXECUTABLES_LIST始终为空 foreach循环的语法使用错误,展开空列表后引发无效参数- 未处理空列表的边界情况,导致
add_dependencies参数不足
修改方案
1. 修复collect_binaries.cmake的列表收集逻辑
原函数无法正确累积父作用域的列表,改用list(APPEND)实现目标的追加:
function(collect target_name) add_executable(${target_name} ${ARGN}) # 将目标追加到临时列表,再同步到父作用域的全局列表 list(APPEND EXECUTABLES_LIST ${target_name}) set(EXECUTABLES_LIST ${EXECUTABLES_LIST} PARENT_SCOPE) endfunction()
2. 修正顶层CMakeLists.txt的遍历与依赖逻辑
调整foreach语法,并添加空列表判断避免报错:
cmake_minimum_required(VERSION 3.15) project( example VERSION 0.0.0 LANGUAGES CXX ) include(cmake/collect_binaries.cmake) set(EXECUTABLES_LIST) add_subdirectory(src) add_custom_target(run_all ALL COMMAND ${CMAKE_COMMAND} -E echo "Running all executables..." ) message(STATUS "executables: ${EXECUTABLES_LIST}") # 仅当列表非空时添加依赖,避免参数不足报错 if(EXECUTABLES_LIST) add_dependencies(run_all ${EXECUTABLES_LIST}) endif() # 直接引用变量名遍历列表,而非展开内容 foreach(exe IN LISTS EXECUTABLES_LIST) add_custom_command( TARGET run_all POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Running ${exe}..." COMMAND $<TARGET_FILE:${exe}> ) endforeach()
验证步骤
执行以下命令即可看到批量运行效果:
mkdir build && cd build && cmake .. && make run_all
输出会依次显示:
Running all executables... Running a... here Running b... here
内容的提问来源于stack exchange,提问作者K. Shores
相关产品推荐
相关产品推荐

