1

我的 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 似乎不知道这个目标(“无规则”)。在构建目录中,调用

grep out.txt -r *

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

4

1 回答 1

2

如果您希望能够输入“make out.txt”,您可能想要add_custom_target代替add_custom_command. 这将创建一个可以构建的目标,并在构建中执行指定的命令。

我建议不要将此目标称为“out.txt”,这会误导它看起来像文本文件而不是目标,而是建议使用更像“RunMain”或“GetOutputOfMain”的东西。

add_custom_target如果您可以将最新版本的 CMake 指定为最低要求,则可以在调用的命令部分中使用“生成器表达式” 。这没有为 记录add_custom_target,但您可以在 文档中阅读生成器表达式add_custom_command。我不确定为了使生成器表达式可用,应将 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)

然后就make RunMain生成out.txt。

如果您不想指定如此高的最低版本,则可以改用过时的LOCATION目标属性:

get_target_property(MyExeLocation MyExe LOCATION)
add_custom_target(
    RunMain ${MyExeLocation} > ${MainOut}
    COMMENT "Running ${MyExeLocation} with output redirected to ${MainOut}")
于 2013-08-31T14:27:57.833 回答