关于C ++:Cmake生成器表达式

Cmake generator expressions

我一直在努力了解CMake中生成器表达式(例如$)的好处,以及何时以及如何使用它们。
谁能用一些例子清楚地解释它。
提前多谢


CMake首先解析项目中的CMakeLists.txt文件-称为"配置阶段",然后生成生成环境-称为"生成阶段"。

因此,基本上,生成器表达式适用于仅生成器可以知道的所有内容:

  • 目标输出的名称和路径(主要是在交叉编译和多配置环境中时)
  • 或更一般而言,生成器评估为将编译器/链接器调用混合在一起的任何目标属性

以下是在项目中使用生成器表达式的示例:

  • 复制可执行文件旁边的文件(在多配置环境中,您不能只使用CMAKE_CURRENT_BINARY_DIR之类的变量)

    1
    2
    3
    4
    5
    6
    7
    add_custom_command(
        TARGET library1
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
           "$<TARGET_FILE:library1>"
           "$<TARGET_FILE_DIR:mainProject>/$<TARGET_FILE_NAME:library1>"
    )

    CMake构建后事件:复制编译的库

    1
    2
    3
    4
    5
    6
    7
    add_custom_command(
        TARGET myBinary
        POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy  
                        "${CMAKE_CURRENT_SOURCE_DIR}/myTest.txt"
                        "$<TARGET_FILE_DIR:myBinary>/myTest.txt"
    )

    如何将外部测试文件添加到cmake项目

  • 区分例如DEBUGRELEASE配置

    1
    add_compile_options("$<$<CONFIG:DEBUG>:/MDd>")

    对于Cmake,您可以使用add_compiler_flags()命令修改发布/调试编译器标志吗?

    在跨平台cmake项目中设置编译器标志的现代方法

  • 使用TARGET_PROPERTY生成器表达式,您可以做很多事情,例如

    1
    2
    3
    4
    5
    file(GENERATE
        OUTPUT"includes.txt"
        CONTENT"$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>
    "

    )

    CMake没有获取链接库的INTERFACE_INCLUDE_DIRECTORIES