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

