无法生成CMake命令
My CMakeLists.txt:无法生成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
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}")