生成器表达式允许 CMake 在构建过程中根据不同的配置(如 Debug、Release)、平台(如 Windows、Linux)、目标类型(如静态库、动态库)等条件,动态调整编译或链接的行为。它们在处理复杂的条件逻辑时非常有用,尤其是在需要支持多配置或多平台时。
生成器表达式的基本语法:
$<condition:expression>
- condition:生成器表达式中的条件,决定 expression 是否被使用。
- expression:当条件成立时返回的值或操作。
可以把生成器表达式应用在许多不同的目标属性上,例如:LINK_LIBRARIES
、INCLUDE_DIRECTORIES
和 COMPILE_DEFINITIONS
等等。这些属性可以使用一些指令来传播这些属性,例如指令 target_link_libraries()
、target_include_directories()
和 target_compile_definitions()
。
生成器表达式可用于启用条件链接、编译时使用的条件定义、条件包含目录等。这些条件可能基于构建配置、目标属性、平台信息或任何其他可查询的信息。
有几种不同类型的生成器表达式,例如:逻辑、信息(Informational)和输出生成器表达式。
逻辑表达式用于创建条件输出。基本的表达式是 0
和 1
表达式。$<0:...>
会产生空字符串,$<1:...>
会生成 ...
。生成器表达式可以嵌套,例如 $<$<>>
本节的练习是使用生成器表达式添加编译器警告标志。
生成器表达式的一个常见用法是有条件地添加编译器标志,例如用于语言级别或警告的标志。一个好的模式是将此信息与 INTERFACE
目标相关联,从而允许此信息传播。
本节练习使用的源代码是官网提供的 Step4
。
编辑 Step4/CMakeLists.txt
文件,并完成 TODO 1
到 TODO 4
。下面是详细的步骤:
首先,修改 CMake 文件中对 CMake 版本的最小要求为 3.15。
cmake_minimum_required(VERSION 3.15<