Cmake 生成器表达式

2021-12-26 00:00:00 cmake c++

我很长时间都想了解 生成器表达式,例如 CMake 中的 $,何时以及如何使用它们.任何人都可以用一些例子清楚地解释它.提前致谢

I'm trying for long time to understand the benefit of generator expressions such as $<xxx:yy> in CMake, when and how to use them. Can anybody explain it clearly with some examples. Many thank in advance

推荐答案

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

CMake does first parse the CMakeLists.txt files in your project - named "Configuration Phase" - and then it generates your build environment - named "Generation Phase".

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

So basically the generator expressions are for everything only the generator could know:

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

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

Here are examples where I use generator expressions in my project:

  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>"
)

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"
)

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

区分例如DEBUGRELEASE 配置

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

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

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

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

With the TARGET_PROPERTY generator expression you could do a lot of things e.g.

file(GENERATE 
    OUTPUT "includes.txt" 
    CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>
"
)

CMake 没有选择链接的 INTERFACE_INCLUDE_DIRECTORIES图书馆

相关文章