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
无法生成CMake命令_Cmake - Fatal编程技术网

无法生成CMake命令

无法生成CMake命令,cmake,Cmake,My CMakeLists.txt: cmake_minimum_required(VERSION 2.6) project(main) SET(MAIN main) SET(MAIN_OUT "${CMAKE_CURRENT_BINARY_DIR}/out.txt") add_executable(${MAIN} main.cpp) # command is unknown add_custom_command(OUTPUT ${MAIN_OUT} POST_BUILD C

My CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project(main)

SET(MAIN main)
SET(MAIN_OUT "${CMAKE_CURRENT_BINARY_DIR}/out.txt")
add_executable(${MAIN} main.cpp)

# command is unknown
add_custom_command(OUTPUT ${MAIN_OUT}
    POST_BUILD
    COMMAND ./${MAIN} > ${MAIN_OUT}
    DEPENDS ${MAIN}
)
编译后,我只想能够键入

make out.txt
然而,cmake似乎不知道这个目标(“无规则”)。在build目录中,调用

grep out.txt -r *

找不到包含out.txt的文件。我如何使我的目标可呼叫?我知道这可能是以前问过的,但我没有找到它。

如果您想能够键入“make out.txt”,您可能希望使用而不是
添加自定义命令。这将创建一个可以构建的目标,并在构建中执行指定的命令

我建议使用类似于“RunMain”或“GetOutputOfMain”的东西,而不是将这个目标称为“out.txt”,这会使它看起来像一个文本文件而不是目标文件

如果可以指定CMake的最新版本作为最低版本,则可以在
add\u custom\u target
调用的命令部分使用“生成器表达式”。对于
add\u custom\u target
,这没有文档记录,但是您可以在的文档中阅读有关生成器表达式的信息。我不确定为了使生成器表达式可用,CMake的最低要求版本应该设置为什么

因此,您的CMakeLists.txt可以更改为:

cmake_minimum_required(VERSION 2.8.10)
project(Test)

add_executable(MyExe main.cpp)

set(MainOut "${CMAKE_CURRENT_BINARY_DIR}/out.txt")
add_custom_target(RunMain $<TARGET_FILE:MyExe> > ${MainOut}
                  COMMENT "Running MyExe with output redirected to ${MainOut}")

# Ensure MyExe is built before trying to build the custom target
add_dependencies(RunMain MyExe)

谢谢,这似乎有效。只是出于兴趣:如果我只想在二进制代码生成后执行一次RunMain,我需要做什么?(假设二进制文件在编译后总是产生相同的输出)我不确定我是否遵循了。只有当您想要构建RunMain时,才必须执行(即构建)它。它不是
ALL
目标的一部分,因此它永远不会自动生成。如果您希望事情自动化,可以使用原始的
add_custom_command
方法将该命令作为生成后事件应用。这样你就没有一个单独的目标;您不能“制造”它-您只需构建MyExe,并且该命令在构建完成时运行。该命令类似于
add\u custom\u命令(TARGET MyExe POST\u BUILD command$>${MainOut}COMMENT“…)
。同意,在这种情况下,我们不需要单独的目标。但是如果我真的想要一个单独的目标,那可能吗?好的,我的答案显示了如何放入自定义目标,并且没有什么可以阻止您使用后期构建命令。您可以考虑尝试让生成后命令执行以生成自定义目标。但是,如果自定义目标依赖于正在构建的对象(在本例中为MyExe),那么将有一个有趣的递归,其中MyExe的后期构建触发构建MyExe!你需要绕开这条路,但这一切似乎都很棘手。我可以选择定制目标并在需要时手动运行它,或者(最好)使用后期构建命令,但不能同时使用两者。
get_target_property(MyExeLocation MyExe LOCATION)
add_custom_target(
    RunMain ${MyExeLocation} > ${MainOut}
    COMMENT "Running ${MyExeLocation} with output redirected to ${MainOut}")