Cmake生成器表达式

Moh*_* El 15 c++ cmake

我正在尝试很长时间来理解生成器表达式的好处, 例如$<xxx:yy>在CMake中,何时以及如何使用它们.任何人都可以通过一些例子清楚地解释清楚.非常感谢

Flo*_*ian 21

CMake首先解析CMakeLists.txt项目中的文件 - 名为"配置阶段" - 然后生成构建环境 - 命名为"生成阶段".

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

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

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

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

    add_custom_command(
        TARGET library1 
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
            "$<TARGET_FILE:library1>"
            "$<TARGET_FILE_DIR:mainProject>/$<TARGET_FILE_NAME:library1>"
    )
    
    Run Code Online (Sandbox Code Playgroud)

    CMake post-build-event:复制编译库

    add_custom_command(
        TARGET myBinary 
        POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy  
                         "${CMAKE_CURRENT_SOURCE_DIR}/myTest.txt" 
                         "$<TARGET_FILE_DIR:myBinary>/myTest.txt"
    )
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 区分例如DEBUGRELEASE配置

    add_compile_options("$<$<CONFIG:DEBUG>:/MDd>")
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    file(GENERATE 
        OUTPUT "includes.txt" 
        CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n"
    )
    
    Run Code Online (Sandbox Code Playgroud)

    CMake没有选择链接库的INTERFACE_INCLUDE_DIRECTORIES

  • 在1中你说“在多配置环境中你不能只使用像`CMAKE_CURRENT_BINARY_DIR`这样的变量”,为什么? (3认同)