CMake生成器表达式(Generator Expressions)是一种在构建系统生成阶段动态求值的特殊语法,用于根据构建配置、平台、目标类型等条件灵活控制构建行为。其核心语法和用法如下: --- 一、基本语法 生成器表达式以 `$<...>` 格式包裹,支持嵌套和逻辑运算: ```cmake $ 条件为真时返回 TRUE_VALUE $ 条件为真时返回 TRUE_VALUE,否则返回 FALSE_VALUE ``` --- 二、常用表达式类型 1. 条件表达式(最常用) - 构建配置判断 ```cmake $:DEBUG_MODE 仅Debug配置生效 $:OPTIMIZED 多个配置生效 ``` - 平台判断 ```cmake $:win_lib Windows平台链接特定库 $:pthread Linux平台链接pthread ``` - 目标类型判断 ```cmake $:EXE_FLAG 仅对可执行文件生效 $:SHARED_FLAG 仅对动态库生效 ``` 2. 逻辑表达式 ```cmake $ 逻辑与 $ 逻辑或 $ 逻辑非 $ 条件选择 ``` 3. 编译相关 ```cmake $:-std=c++17 仅C++文件添加标志 $:-Wstrict-prototypes 仅C文件添加标志 ``` 4. 路径与目标属性 ```cmake $ 获取目标输出文件路径 $ 获取目标的包含目录 ``` --- 三、典型应用场景 1. 条件化编译选项 ```cmake target_compile_options(myapp PRIVATE $<$:-g> Debug模式添加调试符号 $<$:-O3> Release模式启用优化 ) ``` 2. 跨平台库链接 ```cmake target_link_libraries(myapp PRIVATE $:ws2_32.lib $:pthread $:CoreFoundation.framework ) ``` 3. 编译器特定标志 ```cmake set(gcc_like "$") set(msvc "$") target_compile_options(myapp INTERFACE "$<${gcc_like}:-Wall;-Wextra>" "$<${msvc}:-W3>" ) ``` --- 四、注意事项 1. 作用域限制 生成器表达式主要用于: - `target_compile_options()` - `target_link_libraries()` - `add_custom_command()` 2. 调试技巧 使用 `message()` 输出表达式结果(需配置阶段可求值): ```cmake message("Value: $<$:-DBUILD_DEBUG>") ``` 3. 兼容性 需 CMake 3.0+,部分功能(如 `COMPILE_LANGUAGE`)要求 3.3+ 版本。 --- 五、完整示例 ```cmake 根据编译器和配置动态设置警告标志 set(gcc_like_cxx "$") set(msvc_cxx "$") target_compile_options(tutorial_flags INTERFACE "$<${gcc_like_cxx}:$>" "$<${msvc_cxx}:$>" ) ``` > 此例仅为构建阶段添加警告标志,避免污染安装后的目标。
参考资料
[1] [一起来学CMake #06 生成器表达式;list, string, math, file命令简介 - 哔哩哔哩](http://www.bilibili.com/video/BV1bNQWYEEYo)
[2] [CMake进阶:生成器表达式 - CSDN博客](https://blog.csdn.net/haokan123456789/article/details/153694413)
[3] [CMake生成器表达式用法解析 - CSDN博客](https://blog.csdn.net/u013318019/article/details/149562889)
[4] [CMake--生成器表达式(Generator Expressions) 的完整解析 - CSDN博客](https://blog.csdn.net/weixin_45590420/article/details/148587631)
[5] [cmake生成器表达式 - CSDN博客](https://blog.csdn.net/u013318019/article/details/143755136)
[6] [CMake教程(四):生成器表达式 - CSDN博客](https://blog.csdn.net/combination1379/article/details/142302425)
[7] [CMake 基本语法指南 - CSDN博客](https://blog.csdn.net/nangongyuhen/article/details/149229048)
[8] [CMake 生成器表达式---条件表达式和逻辑运算符 - 梦起丶 - 博客园 - 博客园](https://www.cnblogs.com/mengps/p/18516531)
[9] [高效工作学习-cmake生成器表达式 - 哔哩哔哩](http://www.bilibili.com/video/BV1LW4y1c7D4)
[10] [【09】CMake:生成器表达式 - 哔哩哔哩](http://www.bilibili.com/video/BV1zM4m1Q7wZ)
[11] [CMake如何引用外部库?对象库是啥?生成器表达式是啥? - 哔哩哔哩](http://www.bilibili.com/video/BV1Nu4y1q7a1)
[12] [CMake基础教程04-使用生成器表达式 - 哔哩哔哩](http://www.bilibili.com/video/BV16u411s7Rk)
[13] [cmake如何打印出当前配置以及生成表达式 - 哔哩哔哩](http://www.bilibili.com/video/BV1HP4y1q7SV)
[14] [【CMake】《CMake构建实战:项目开发卷》笔记-Chapter8-生成器表达式 - CSDN博客](https://blog.csdn.net/github_38647413/article/details/147002891)
[15] [cmake基础教程(40)生成器表达式_cmake 生成器 - 51CTO博客](https://blog.51cto.com/u_16099234/14343867)
[16] [【CMake】CMake入门(四)生成器表达式 安装与测试 系统特性检测 自定义命令以及输出文件 - CSDN博客](https://blog.csdn.net/qq_65207641/article/details/139048025)
[17] [CMake生成器表达式终极指南:条件编译与属性设置高级技巧 - CSDN博客](https://blog.csdn.net/gitblog_00080/article/details/154403054)
[18] [CMake 生成器表达式介绍 - CSDN博客](https://blog.csdn.net/u011283226/article/details/143274496)
[19] [CMake 生成器表达式---条件表达式和逻辑运算符 - CSDN博客](https://blog.csdn.net/weixin_42410317/article/details/143378796)