计算机
c base
c++ 基础 作用域及生命周期
c++ template
c++ 内存视角
c++ 函数指针
c++ 基础 基础语法
c++ 多线程
c++ 性能
c++ 类 基础
c++ 类 对象模型 类析构
c++ 类 设计模式
cmake
CMAKE环境搭建 windows
创建第一个cmakelists.txt
构建稍复杂的项目
动态链接库
EX1
EX1 START
EX1 ANSWER
EX2
EX2 START
EX2 ANSWER
EX3
EX3 START
EX3 ANSWER
变量
控制流程
函数和宏
查找和使用外部库
生成器表达式
qt 开发环境
qt c++
理解QObject 1
理解QObject 4
qt index
qt qml quick
qt ui
qt 多线程
数据结构 数组
PC问题监控及排查
PC程序性能优化
OS
TOOL
C++ STL
编程漫谈
C++实战-生产者 消费者流水线
C++实战 IO
本站点使用 MrDoc 构建
-
+
生成器表达式
**问题场景:** ```cmake # ❌ 这不会按预期工作 if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_compile_definitions(myapp PRIVATE DEBUG_MODE) endif() ``` **问题:** 对于多配置生成器(如 Visual Studio>、Xcode),`CMAKE_BUILD_TYPE` 在配置时是空的, 构建类型在构建时才确定。 生成器表达式使用 `$<...>` 语法: ```cmake $<expression> ``` ### 常用表达式 #### 配置相关 ```cmake # 在 Debug 模式下添加定义 target_compile_definitions(myapp PRIVATE $<$<CONFIG:Debug>:DEBUG_BUILD> $<$<CONFIG:Release>:RELEASE_BUILD> ) # 根据配置设置不同的编译选项 target_compile_options(myapp PRIVATE $<$<CONFIG:Debug>:-Wall -Wextra -g> $<$<CONFIG:Release>:-O3 -DNDEBUG> ) ``` #### 平台相关 ```cmake # 平台特定的编译定义 target_compile_definitions(myapp PRIVATE $<$<PLATFORM_ID:Windows>:WINDOWS_BUILD> $<$<PLATFORM_ID:Linux>:LINUX_BUILD> $<$<PLATFORM_ID:Darwin>:MACOS_BUILD> ) # 平台特定的链接库 target_link_libraries(myapp PRIVATE $<$<PLATFORM_ID:Windows>:ws2_32> $<$<PLATFORM_ID:Linux>:pthread> ) ``` #### 编译器相关 ```cmake # 编译器特定的选项 target_compile_options(myapp PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra> $<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Wno-unused-parameter> $<$<CXX_COMPILER_ID:MSVC>:/W4> ) ``` #### COMPILE_LANGUAGE 根据编译语言设置选项: ```cmake # C 和 C++ 使用不同的选项 target_compile_options(myapp PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17> $<$<COMPILE_LANGUAGE:C>:-std=c11> ) ``` #### 目标属性 ```cmake # 使用目标的输出名称 set(OUTPUT_NAME $<TARGET_PROPERTY:myapp,OUTPUT_NAME>) # 使用目标的源目录 set(SOURCE_DIR $<TARGET_PROPERTY:myapp,SOURCE_DIR>) ``` #### 路径相关 区分构建时和安装时的路径: ```cmake target_include_directories(mylib PUBLIC # 构建时使用源代码目录 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # 安装后使用安装目录 $<INSTALL_INTERFACE:include> ) ``` ### 布尔运算 ```cmake # AND 运算 $<AND:condition1,condition2> # OR 运算 $<OR:condition1,condition2> # NOT 运算 $<NOT:condition> ``` ### 条件表达式 ```cmake $<IF:condition,true_value,false_value> ``` ### 字符串操作 ```cmake # 转换为小写 $<LOWER_CASE:string> # 转换为大写 $<UPPER_CASE:string> # 连接字符串 $<JOIN:list,separator> ```
peipeo
2026年5月16日 15:47
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码