C++ 在CMake中使用单个命令运行多个可执行文件,并将结果输出收集到.txt文件中
我有一个简单的玩具项目,结构如下:C++ 在CMake中使用单个命令运行多个可执行文件,并将结果输出收集到.txt文件中,c++,cmake,C++,Cmake,我有一个简单的玩具项目,结构如下: (base) ciaran@DESKTOP-K0APGUV:/mnt/d/TestProject$ tree . . ├── CMakeLists.txt ├── first.cpp └── second.cpp 0 directories, 3 files //first.cpp #包括 int main(){ 标准::cout 如何将可执行目标FirstProgram和SecondProgram收集在一起,以便轻松运行它们 然后使用cmake中的参数调
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/TestProject$ tree .
.
├── CMakeLists.txt
├── first.cpp
└── second.cpp
0 directories, 3 files
//first.cpp
#包括
int main(){
标准::cout
如何将可执行目标FirstProgram和SecondProgram收集在一起,以便轻松运行它们
然后使用cmake中的参数调用该脚本:
add_custom_target(capture_output_of_FirstProgram_and_save_it
COMMAND ${CMAKE_COMMAND}
-D COMMAND=$<TARGET_FILE:FirstProgram>
-D OUTPUTFILE=${CMAKE_CURRENT_BINARY_DIR}/first_program_output.txt
-P ${CMAKE_CURRENT_SOURCE_DIR}/capture_command_output_to_file.cmake
)
add_custom_target(捕获_FirstProgram_的输出并保存它
命令${CMAKE_COMMAND}
-D命令=$
-D OUTPUTFILE=${CMAKE\u CURRENT\u BINARY\u DIR}/first\u program\u output.txt
-P${CMAKE_CURRENT_SOURCE_DIR}/capture_command_output_to_file.CMAKE
)
但是,如果您知道您将使用shell-ish-generator,您可以只使用shell重定向(这将是不可移植的)
就我个人而言,我使用一个仅用作别名/快捷目标的主Makefile来轻松构建、测试和部署&无论项目是什么,我都在那里保留多个cmake配置,Makefile中的所有目标都是假的,真正的执行只是在cmake binary dir中进行。我使用make只是因为目标名称外壳中的自动完成。但我这样做是因为我只在linux环境中工作
对于此答案的第一部分,是否可以从目标列表中添加命令
set(第一个程序第二个程序的目标列表)
#你可以用宏来包装它
#创建要传递给添加\自定义\目标的参数
设置(添加\自定义\目标\参数)
foreach(目标列表中的i)
列表(附加添加\自定义\目标\参数命令$)
endforeach()
#那就叫它
添加自定义目标(轻松地一起运行)
${add_custom_target_args}
)
如何将可执行目标FirstProgram和SecondProgram收集在一起,以便轻松运行它们
然后使用cmake中的参数调用该脚本:
add_custom_target(capture_output_of_FirstProgram_and_save_it
COMMAND ${CMAKE_COMMAND}
-D COMMAND=$<TARGET_FILE:FirstProgram>
-D OUTPUTFILE=${CMAKE_CURRENT_BINARY_DIR}/first_program_output.txt
-P ${CMAKE_CURRENT_SOURCE_DIR}/capture_command_output_to_file.cmake
)
add_custom_target(捕获_FirstProgram_的输出并保存它
命令${CMAKE_COMMAND}
-D命令=$
-D OUTPUTFILE=${CMAKE\u CURRENT\u BINARY\u DIR}/first\u program\u output.txt
-P${CMAKE_CURRENT_SOURCE_DIR}/capture_command_output_to_file.CMAKE
)
但是,如果您知道您将使用shell-ish-generator,您可以只使用shell重定向(这将是不可移植的)
就我个人而言,我使用一个仅用作别名/快捷目标的主Makefile来轻松构建、测试和部署&无论项目是什么,我都在那里保留多个cmake配置,Makefile中的所有目标都是假的,真正的执行只是在cmake binary dir中进行。我使用make只是因为目标名称外壳中的自动完成。但我这样做是因为我只在linux环境中工作
对于此答案的第一部分,是否可以从目标列表中添加命令
set(第一个程序第二个程序的目标列表)
#你可以用宏来包装它
#创建要传递给添加\自定义\目标的参数
设置(添加\自定义\目标\参数)
foreach(目标列表中的i)
列表(附加添加\自定义\目标\参数命令$)
endforeach()
#那就叫它
添加自定义目标(轻松地一起运行)
${add_custom_target_args}
)
对于此答案的第一部分,是否可以从目标列表中添加命令,而不必键入命令target1;命令target2;等等。
?从目标列表中?该列表如何存储?您可以对每个执行一些操作,此时它是一个cmake
变量:设置(示例\u可执行文件\u目标为“第一个程序”“第二个程序”)
。问题是,如果你在添加自定义目标上执行foreach
操作,你实际上会创建许多目标,而不是的对象一起运行它们,很容易编辑答案。因此在foreach
中创建参数,这些参数将传递给单个添加自定义目标。
。谢谢。首先感谢你这个答案的一部分是,是否可以从目标列表中添加命令,而不必从目标列表中键入命令target1;命令target2;等等
??该列表如何存储?您可以在其acmake
变量:设置时执行一些foreach
(示例\u可执行文件\u目标为“第一个程序”“第二个程序”)
。问题是,如果你在添加自定义目标上执行foreach
操作,你实际上会创建许多目标,从而使的对象无法一起运行它们。编辑答案很容易。因此,在foreach
中创建参数,这些参数将传递给单个添加自定义目标。
。谢谢。非常感谢。
//second.cpp
#include <iostream>
int main() {
std::cout << "Hello, World From the Second Program" << std::endl;
return 0;
}
}
add_custom_target(run_them_together_easily
COMMAND $<TARGET_FILE:FirstProgram>
COMMAND $<TARGET_FILE:SecondProgram>
)
# capture_command_output_to_file.cmake
# Arguments: COMMAND and OUTPUTFILE
execute_process(
COMMAND ${COMMAND}
OUTPUT_VARIABLE result
)
file(WRITE ${OUTPUTFILE} ${result})
# TODO: Fail if execute_process fails, for example
add_custom_target(capture_output_of_FirstProgram_and_save_it
COMMAND ${CMAKE_COMMAND}
-D COMMAND=$<TARGET_FILE:FirstProgram>
-D OUTPUTFILE=${CMAKE_CURRENT_BINARY_DIR}/first_program_output.txt
-P ${CMAKE_CURRENT_SOURCE_DIR}/capture_command_output_to_file.cmake
)
set(list_of_targets FirstProgram SecondProgram)
# you could wrap this in some macro
# create arguments to be passed to add_custom_target
set(add_custom_target_args)
foreach(i IN LISTS list_of_targets)
list(APPEND add_custom_target_args COMMAND $<TARGET_FILE:${i}>)
endforeach()
# then call it
add_custom_target(run_them_together_easily
${add_custom_target_args}
)