Linux
Linux software install
Google repo的使用
Vector AP StartApplication编译脚本解析
Yocto的cmake版本升级
不能自动安装的解决方式
S32G-BSP35.0-SDK使用方法
S32G从SDK生成文件系统的制作过程
Linux Samba设置
Linux添加双网卡
S32G USB-Redirector安装指南
VS code自动生成Doxygen格式注释
Linux下使用多线程下载
使用pandoc 生成带中文的pdf
minicom无法输入的问题解决办法
使用 systemd unit 添加一条路由规则
CMake 教程
步骤 1:基本起点
步骤 2:添加lib库
步骤 3:为库添加使用要求
步骤 4:添加生成器表达式
步骤 5:安装和测试
步骤 6:添加支持测试仪表板
步骤 7: 添加系统内省
步骤 8:自定义命令和生成的文
步骤 9:打包安装程序
步骤 10:选择静态库或共享库
步骤 11:添加导出配置
步骤 12:打包 Debug 和 Release
添加虚拟网卡
Vector AP 去掉防篡改校验
Vector AP startapplication编译与使用
Vector AP问题汇总
Vector AP大型项目开发流程
Vector AP EM
Vector AP 最简单的开发示例
Linux kernel 版本降级
Vector AP StartApplicaiton
startappplication-machine-design
startapplicaiton-machine-integration
amsr-vector-fs-em-executionmanager-design
amsr-vector-fs-em-executionmanager
Vector AP 复杂模型的开发
第一章 Machine和MachineDesign
第二章 Execute Manager
第三章 Log
第四章 State Manager
第五章 State Manager 源码的理解
第六章 Someip daemon
第七章 IPC Service Discovery Daemon
crond的使用方法
解决蓝牙鼠标在 Ubuntu 中单位时间内断开的问题
VPS服务器自建教程
v2rayA的客户端使用配置
GDB调试指南入门篇:揭开程序运行世界的神秘面纱
GDB调试指南高级篇:成为调试专家,掌控程序的命运
Linux安装PyQt5并配置Qt Designer
ADB 命令大全
GoogleTest(一)
GoogleTest(二)简单的TEST宏
GoogleTest(三)简单类函数测试
C++ Template
1. 函数模板
2. 类模板
3. 非类型模板参数
软件版本号规范
EPOLL
C++手札
C++ 使用{}初始化有哪些好处?
现代 C++ decltype 深入解析
函数对象(functor)
Linux性能剖析:CPU、内存、网络与I/O压力测试
AP StateManager
C++ Lambda表达式
C++ 中的Lambda表达式
Lambda 表达式语法
Lambda 表达式的示例
手动发送UDP数据包
pyqt5生成的UI界面不能输入中文
自己搭建repo镜像
摄影
Sony仿富士PP值设置
诗词歌赋
本文档使用 MrDoc 发布
-
+
首页
步骤 4:添加生成器表达式
# Step 4: Adding Generator Expressions `生成器表达式` 在构建系统生成期间计算,以生成特定于每个构建配置的信息。 `生成器表达式`] 允许在许多目标属性的上下文中使用,例如 `LINK_LIBRARIES`, `INCLUDE_DIRECTORIES`, `COMPILE_DEFINITIONS` 等。它们还可以在使用命令填充这些属性时使用,例如 `target_link_libraries()`, `target_include_directories()`, `target_compile_definitions()` 等。 `生成器表达式` 可用于启用条件链接、编译时使用的条件定义、条件包含目录等。条件可以基于构建配置、目标属性、平台信息或任何其他可查询的信息。 有不同类型的 `生成器表达式`,包括逻辑表达式、信息表达式和输出表达式。 逻辑表达式用于创建条件输出。基本表达式是 `0` 和 `1` 表达式。`$<0:...>` 生成空字符串,`$<1:...>` 生成 `...` 的内容。它们也可以嵌套使用。 ## Exercise 1 - 使用生成器表达式添加编译器警告标志 `生成器表达式` 的常见用法之一是有条件地添加编译器标志,例如语言级别或警告。一个不错的模式是将这些信息关联到一个`INTERFACE`目标,使得这些信息能够传播。 ### Goal 构建时添加编译器警告标志,但在安装版本中不添加。 ### Helpful Resources + `cmake-generator-expressions(7)` + `cmake_minimum_required()` + `set()` + `target_compile_options()` ### Files to Edit + `CMakeLists.txt` ### Getting Started 打开文件 `Step4/CMakeLists.txt` 并完成 `TODO 1` 到 `TODO 4`。 首先,在顶层的 `CMakeLists.txt` 文件中,我们需要将 `cmake_minimum_required()` 设置为 `3.15`。在这个练习中,我们将使用在 CMake 3.15 中引入的生成器表达式。 接下来,我们添加我们项目所需的编译器警告标志。由于警告标志根据编译器而异,我们使用 `COMPILE_LANG_AND_ID` 生成器表达式来控制在给定语言和一组编译器标识的情况下应用哪些标志。 ### Build and Run 创建一个名为 `Step4_build` 的新目录,运行 `cmake` 可执行文件或 `cmake-gui` 来配置项目,然后使用你选择的构建工具构建项目,或者在构建目录中使用 `cmake --build .` 进行构建。 ```bash mkdir Step4\_build cd Step4\_build cmake ../Step4 cmake --build . ``` ### Solution 更新 cmake_minimum_required(),要求至少需要 CMake 版本 3.15: #### TODO 1: CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.15) ``` 接下来,我们确定当前系统正在使用的编译器来构建,因为警告标志根据我们使用的编译器而变化。这可以通过 `COMPILE_LANG_AND_ID` 生成表达式来实现。我们将结果分别设置为变量 `gcc_like_cxx` 和 `msvc_cxx`,如下所示: #### TODO 2: CMakeLists.txt ```cmake set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>") set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>") ``` 接下来,我们添加我们项目所需的所需的编译器警告标志。使用我们的变量 `gcc_like_cxx` 和 `msvc_cxx`,我们可以使用另一个生成表达式仅在这些变量为真时应用相应的标志。我们使用 `target_compile_options()` 将这些标志应用到我们的接口库。 #### TODO 3: CMakeLists.txt ```cmake target_compile_options(tutorial_compiler_flags INTERFACE "$<${gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>" "$<${msvc_cxx}:-W3>" ) ``` 最后,我们只希望在构建过程中使用这些警告标志。我们安装的项目的消费者不应该继承我们的警告标志。为了指定这一点,我们使用 `BUILD_INTERFACE` 条件将我们在 TODO 3 中的标志包裹在生成表达式中。最终的完整代码如下所示: #### TODO 4: CMakeLists.txt ```cmake target_compile_options(tutorial_compiler_flags INTERFACE "$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>" "$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>" ) ```
admin
2024年3月1日 10:53
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码