具有自动生成源的 Cmake 可执行文件

Posted

技术标签:

【中文标题】具有自动生成源的 Cmake 可执行文件【英文标题】:Cmake executable with auto-generated sources 【发布时间】:2015-09-10 22:54:39 【问题描述】:

我想从例如 test_runner.cpp 创建一个可执行文件:

add_executable(myexe $CMAKE_CURRENT_BINARY_DIR/test_runner.cpp)

但是这个特定的 cpp 文件本身是在预构建命令中自动生成的:

add_custom_command(
    TARGET myexe PRE_BUILD
    COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "$CMAKE_CURRENT_BINARY_DIR/test_runner.cpp" src/My_test_suite.h
    WORKING_DIRECTORY "$CMAKE_CURRENT_SOURCE_DIR"
)

但现在我无法生成新的 cmake 构建文件,因为它抱怨缺少源,在预构建之前确实丢失了。

【问题讨论】:

【参考方案1】:

问题的症结在于将GENERATED property 应用于“test_runner.cpp”。这告诉 CMake 在配置时不要检查它的存在,因为它是作为构建过程的一部分创建的。

您可以手动应用此属性(例如使用set_source_files_properties)。但是,处理此问题的正确方法是使用add_custom_command 的另一种形式,即add_custom_command(OUTPUT ...) 而不是add_custom_command(TARGET ...)

如果您将“test_runner.cpp”指定为 add_custom_command(OUTPUT ...) 调用的输出,那么任何使用它的目标(在本例中为“myexe”)都会导致在构建该目标之前调用自定义命令。

所以你真的只需要将你的代码更改为:

set(TestRunner "$CMAKE_CURRENT_BINARY_DIR/test_runner.cpp")
add_executable(myexe $TestRunner)
add_custom_command(
    OUTPUT $TestRunner
    COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "$TestRunner" src/My_test_suite.h
    WORKING_DIRECTORY "$CMAKE_CURRENT_SOURCE_DIR"
)

【讨论】:

太完美了。谢谢你。我发现 cmake 比它最初出现的更详尽和细致入微,我绝对需要阅读它的文档封面。但最终还是值得的,因为 cmake 非常有用。 如果使用的生成文件是由其他目标生成的,请不要忘记add_dependencies(myExe theOtherTargetGeneratingTestRunner) 以确保在编译开始时文件在所有情况下(而不仅仅是偶然)都可用。跨度>

以上是关于具有自动生成源的 Cmake 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

cmake 生成汇编文件然后编译成可执行文件

CMake基础教程(24)add_executable生成目标可执行文件

检查文件具有使用CMake的执行权限

CMake项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中

使用 CMake 将资源(例如,着色器代码;图像)嵌入到可执行文件/库中

CMake 多配置生成器使用错误的构建目录