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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:23:30