如何在CMake中一键运行多可执行文件并捕获输出到文本文件
解决方案:一键运行多目标并捕获输出
针对你的两个CMake需求,我来给你具体的实现方案,直接通过修改CMakeLists.txt就能搞定所有流程:
1. 完整修改后的CMakeLists.txt
先把你的配置调整好,同时实现一键运行和输出捕获的功能:
cmake_minimum_required(VERSION 3.18) project(TestProject) set(CMAKE_CXX_STANDARD 14) # 保留原有的可执行目标(这里帮你修正了一个小错误:原SecondProgram误用了first.cpp) add_executable(FirstProgram first.cpp) add_executable(SecondProgram second.cpp) # 自定义目标:一键运行所有程序并自动捕获输出 add_custom_target(RunAllPrograms # 确保先完成两个可执行文件的构建 DEPENDS FirstProgram SecondProgram # 运行FirstProgram,将标准输出+错误写入对应文件 COMMAND $<TARGET_FILE:FirstProgram> > first_program_output.txt 2>&1 # 运行SecondProgram,同理捕获输出 COMMAND $<TARGET_FILE:SecondProgram> > second_program_output.txt 2>&1 # 指定工作目录为构建目录,保证输出文件生成在预期位置 WORKING_DIRECTORY ${CMAKE_BINARY_DIR} # 给目标加个描述,方便识别作用 COMMENT "Running all programs and saving output to files..." )
关键细节解释
- 修复了你的配置错误:你原来的
SecondProgram绑定的是first.cpp,这样两个程序输出完全一致,我已经改成了second.cpp。 $<TARGET_FILE:TargetName>:CMake的生成器表达式,会自动根据系统生成可执行文件的完整路径(比如Windows下带.exe后缀),完美适配跨平台场景。- 输出重定向:
> output.txt把程序的标准输出写入文件,2>&1把标准错误也同步写入,确保所有输出都被捕获。 DEPENDS关键字:强制要求在运行自定义目标前,先完成两个可执行文件的构建,避免出现"找不到可执行文件"的问题。
2. 使用方法
常规使用(手动触发运行)
- 先完成构建配置:
mkdir build && cd build cmake .. - 执行自定义目标:
# Linux/macOS make RunAllPrograms # Windows(使用MSBuild) cmake --build . --target RunAllPrograms
自动运行(构建时自动触发)
如果希望执行make或cmake --build .时自动运行所有程序,只需要给add_custom_target加上ALL关键字:
add_custom_target(RunAllPrograms ALL DEPENDS FirstProgram SecondProgram # 后续命令不变 )
3. 验证结果
执行完成后,你会在build目录下看到:
- 生成的两个可执行文件:
FirstProgram/FirstProgram.exe、SecondProgram/SecondProgram.exe - 两个输出文件:
first_program_output.txt:内容为Hello, World from the first programsecond_program_output.txt:内容为Hello, World From the Second Program
这样就完全实现了你的两个需求:一键运行所有程序,同时自动把输出保存到对应文件里。
内容的提问来源于stack exchange,提问作者CiaranWelsh
相关产品推荐
相关产品推荐

