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

CMake如何批量生成子目录cpp对应可执行并输出到指定目录

优化后的CMake实现方案

首先你原有的配置存在两处可修正的问题:

  • add_executable 中指定的源文件缺少 .cpp 后缀
  • target_link_libraries 传入的目标名和 add_executable 定义的目标名不匹配(比如你定义的目标是 dbg_pair_creation,链接时用的是 pair_creation,会触发构建错误)

你可以通过循环遍历源文件的方式简化配置,同时实现可执行文件输出到pair目录的需求,代码如下:

# 方式一:自动匹配pair目录下所有benchmark_开头的cpp文件,新增同规则文件无需修改配置
file(GLOB PAIR_BENCH_SRCS pair/benchmark_*.cpp)

# 方式二:手动指定源文件,文件变更时需要修改,比自动匹配更稳妥
# set(PAIR_BENCH_SRCS
#     pair/benchmark_create.cpp
#     pair/benchmark_insert.cpp
#     pair/benchmark_remove.cpp
# )

foreach(SRC_FILE ${PAIR_BENCH_SRCS})
    # 提取不带后缀的文件名,例如 benchmark_create
    get_filename_component(EXEC_NAME ${SRC_FILE} NAME_WE)
    # 拼接生成dbg开头的目标名,例如 dbg_benchmark_create
    set(TARGET_NAME dbg_${EXEC_NAME})
    add_executable(${TARGET_NAME} ${SRC_FILE})
    # 链接依赖库
    target_link_libraries(${TARGET_NAME} benchmark::benchmark)
    # 设置可执行文件输出到pair目录
    set_target_properties(${TARGET_NAME} PROPERTIES
        # 如果要输出到源文件所在的pair目录,用CMAKE_CURRENT_SOURCE_DIR
        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/pair
        # 如果要输出到构建目录下的pair目录,改用下面的配置
        # RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pair
    )
endforeach()

这段配置的优势:

  • 无需重复编写多组add_executable、target_link_libraries语句,代码更简洁易维护
  • 自动处理目标名和输出路径配置,避免手动编写出现的名称不匹配错误
  • 后续新增同规则benchmark文件时,自动匹配模式下无需修改CMake配置即可生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:18:02