Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在CMake中使用单个命令运行多个可执行文件,并将结果输出收集到.txt文件中_C++_Cmake - Fatal编程技术网

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;等等
?该列表如何存储?您可以在其a
cmake
变量:
设置时执行一些
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}
)