Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者

新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Cmake之3.0介绍
    • 🌻3.代码实例
      • 🐓3.1. 改进的目标属性管理
      • 🐓3.2. 改进的 CMake Presets 支持
      • 🐓3.3. 支持生成器表达式
      • 🐓3.4. 改进的 Find 模块
      • 🐓3.5. 引入 CMake 3.0 生成器
      • 🐓3.6. 引入 `file` 命令的新功能
      • 🐓3.7. 支持静态库和动态库的选择

🌻1.前言

本篇目的:Cmake之3.0版本重要特性及用法实例

🌻2.Cmake之3.0介绍

CMake 3.0 版本发布于 2015 年,是 CMake 系列中的一次重大更新,引入了众多新特性和改进。这一版本不仅扩展了 CMake 的功能,还改进了用户体验和性能。以下是 CMake 3.0 版本的重要特性:

1. 现代 CMake 特性
CMake 3.0 强调了现代 CMake 的使用方式,鼓励开发者使用更简洁和强大的 CMake 语法。这包括使用 target_* 命令(如 target_include_directories, target_link_libraries 等)来管理项目的构建设置,而不是使用全局变量。这样的改进提高了构建脚本的可维护性和可读性。

2. 支持 C++11 标准
CMake 3.0 增强了对 C++11 标准的支持,使得开发者可以在 CMake 项目中更轻松地使用 C++11 特性。这包括支持 C++11 编译选项和标准库,使得开发者能够利用 C++11 的新特性进行开发,并确保编译器和构建工具链与 C++11 标准兼容。

3. 引入目标属性管理
CMake 3.0 引入了 target_properties 机制,使得开发者可以为每个目标(如库或可执行文件)设置特定的属性。这些属性包括编译选项、链接选项、包括路径等,从而更精细地控制每个目标的构建过程。这种方法比全局设置更具灵活性,避免了设置冲突和不一致的问题。

4. 增强的 Find 模块
CMake 3.0 对 Find 模块进行了显著改进,引入了更多的查找模块和改进了现有模块的功能。例如,增强了对第三方库的支持,使得查找和配置外部库变得更加简单和可靠。这些改进减少了手动配置依赖项的繁琐工作,提高了开发效率。

5. 支持生成 Xcode 7 和 Visual Studio 2015 项目
CMake 3.0 增强了对现代 IDE 的支持,包括 Xcode 7 和 Visual Studio 2015。这一版本确保了与最新版本的 IDE 的兼容性,使得开发者可以在最新的开发环境中顺利使用 CMake,确保了构建系统与最新工具链的兼容性。

6. 改进的 CPack 打包系统
CMake 3.0 对 CPack 打包系统进行了改进,增加了对新的打包格式和生成选项的支持。例如,新增了对生成 AppImage(用于 Linux 的独立应用包)和支持更多平台的安装包格式的支持。这使得发布和分发软件变得更加方便。

7. 支持跨编译器和工具链配置
CMake 3.0 提供了更强大的工具链和跨编译器配置功能。开发者可以通过工具链文件和 CMake 的配置选项灵活地设置编译器、链接器和其他工具链组件。这对于交叉编译和定制构建环境非常重要。

8. 改进的测试和报告功能
CMake 3.0 强化了测试框架,提供了更丰富的测试功能和报告选项。CTest 支持更详细的测试结果报告,包括测试覆盖率和性能数据。通过更好的集成和配置选项,CMake 3.0 帮助开发者实现了更有效的持续集成和自动化测试流程。

9. 性能优化和稳定性提升
CMake 3.0 在性能方面进行了优化,特别是在处理大型项目时表现更佳。改进了构建过程的效率,减少了配置时间和资源消耗,同时修复了多个已知问题,提高了整体稳定性。

🌻3.代码实例

🐓3.1. 改进的目标属性管理

  • 功能描述: CMake 3.0 引入了 TARGET_PROPERTY,使得对目标属性的管理更加灵活,可以直接在 CMake 脚本中查询和设置目标的属性。
  • 文件例子:
    # CMakeLists.txt
    project(TargetPropertiesManagement)add_executable(MyApp main.cpp)# 设置目标属性
    set_target_properties(MyApp PROPERTIES CXX_STANDARD 11)# 查询目标属性
    get_target_property(MYAPP_STANDARD MyApp CXX_STANDARD)
    message(STATUS "MyApp C++ Standard: ${MYAPP_STANDARD}")
    

🐓3.2. 改进的 CMake Presets 支持

  • 功能描述: CMake 3.0 强化了预设支持,允许用户定义和使用构建预设来简化和标准化构建过程。尽管预设功能在 3.0 中相对基础,但为后续版本的增强奠定了基础。
  • 文件例子:
    # CMakeLists.txt
    project(PresetsExample)# 定义预设选项
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type")
    

🐓3.3. 支持生成器表达式

  • 功能描述: CMake 3.0 引入了生成器表达式,允许在构建配置中使用更复杂的逻辑,这对于条件构建和配置非常有用。
  • 文件例子:
    # CMakeLists.txt
    project(GeneratorExpressionsExample)add_executable(MyApp main.cpp)# 使用生成器表达式设置目标链接库
    target_link_libraries(MyApp $<IF:$<CONFIG:Debug>,debug_lib,release_lib>)
    

🐓3.4. 改进的 Find 模块

  • 功能描述: CMake 3.0 对 FindXXX.cmake 模块进行了改进,增加了对更多第三方库的支持,并增强了库查找和配置的准确性。
  • 文件例子:
    # CMakeLists.txt
    project(FindModuleExample)find_package(OpenGL REQUIRED)
    add_executable(MyApp main.cpp)
    target_link_libraries(MyApp ${OPENGL_LIBRARIES})
    

🐓3.5. 引入 CMake 3.0 生成器

  • 功能描述: CMake 3.0 增强了生成器的支持,提供了更多的选项和灵活性,以适应不同的开发环境和工具链。
  • 文件例子:
    # 生成 Ninja 项目
    cmake -G "Ninja" .# 生成 Visual Studio 2015 项目
    cmake -G "Visual Studio 14 2015" .
    

🐓3.6. 引入 file 命令的新功能

  • 功能描述: CMake 3.0 增强了 file 命令,添加了更多的功能,例如读取和写入文件内容,进行文件操作等。
  • 文件例子:
    # CMakeLists.txt
    project(FileCommandExample)# 读取文件内容
    file(READ "input.txt" FILE_CONTENT)
    message(STATUS "File Content: ${FILE_CONTENT}")# 写入文件内容
    file(WRITE "output.txt" "This is some output text.")
    

🐓3.7. 支持静态库和动态库的选择

  • 功能描述: CMake 3.0 允许用户通过 CMake 配置文件指定要构建的库类型(静态库或动态库),增加了灵活性。
  • 文件例子:
    # CMakeLists.txt
    project(LibraryTypeExample)option(BUILD_SHARED_LIBS "Build using shared libraries" ON)add_library(MyLib src.cpp)add_executable(MyApp main.cpp)
    target_link_libraries(MyApp MyLib)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 安装nodejs环境

文章目录 Node.js简介Node.js的核心特性Node.js的生态系统Node.js的模块系统 部署下载Node.js预编译二进制包上传到Linux服务器并解压配置环境变量验证安装 部署在下边&#xff0c;我先对nodejs进行一些介绍&#xff0c;大家了解一下 Node.js简介 Node.js是一个基于Chrome V8…

2024国赛数学建模A题B题C题D题E题思路资料模型

开始在本帖实时更新2024国赛数学建模赛题思路代码&#xff0c;文章末尾获取&#xff01; 持续更新参考思路

港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”&#xff0c;做了题为“三个创新&#xff1a;培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…

OneHotEncoder一个不太合理的地方

OneHotEncoder&#xff0c;在Xtrain上fit&#xff0c;在Xtest上transform 如果遇到某个值出现在Xtest&#xff0c;而没有在Xtrain出现过时&#xff0c;会抛出如下错误&#xff1a; OneHotEncoder Found unknown categories [xxx] in column xx during transform OneHotEncoder …

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介 1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 &#xff08;OTA&#xff09; 3在线编程&#xff08;ICP把整个程序都更新掉&#xff09; 1 系统的Bootloader写死了&#xff0c;只能用串口下载到指定的位置&a…

基于SpringBoot校园快递代取系统

基于springbootvue实现的校园快递代取系统&#xff08;源码L文ppt&#xff09;4-049 3系统设计 3.1.1系统结构图 系统结构图可以把杂乱无章的模块按照设计者的思维方式进行调整排序&#xff0c;可以让设计者在之后的添加&#xff0c;修改程序内容…

第四届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2024)

目录 ​编辑 重要信息 大会介绍 合作单位 主讲嘉宾 会议组委 会议历史 重要日期 征稿主题 参会方式 会议日程 重要信息 官网&#xff1a;www.ic-cei.org&#xff08;点击了解参会&#xff0c;投稿等信息&#xff09; 中国-广州 | 2024年11月8-10日 二轮截稿…

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置&#xff1a; // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.…

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…

Qt QLineEdit 输入内容后字数在右侧动态展示

前言 QLineEdit 设置可输入最大长度可以使用 lineEdit->setMaxLength(10); 怎么实时的把当前输入字数显示出来呢&#xff0c;像饿了么的 input 组件那样 <el-inputtype"text"placeholder"请输入内容"v-model"text"maxlength"10&q…

0基础学习爬虫系列:程序打包部署

1.目标 将已经写好的python代码&#xff0c;打包独立部署或运营。 2. 环境准备 1&#xff09;通义千问 &#xff1a;https://tongyi.aliyun.com/qianwen 2&#xff09;0基础学习爬虫系列–网页内容爬取&#xff1a;https://blog.csdn.net/qq_36918149/article/details/14199…

kubernetes微服务基础及类型

目录 1 什么是微服务 2 微服务的类型 3 ipvs模式 ipvs模式配置方式 4 微服务类型详解 4.1 ClusterIP 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 metalLB配合loadbalance实现发布IP 1 什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&…

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前&#xff0c;不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础&#xff0c;因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示&#xff0c;很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间…

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存中没有命中&#xff0c;会去数据库中查询&#xff0c;而数据库中也没有该数据&#xff0c;并且每次查询都不会命中缓存&#xff0c;从而每次请求都直接打到了数据库上&#xff0c;这会给数据…

django ubuntu 踩坑集锦

目录 1 ubantu mysql查看表结构2 导入同级目录文件出现未解析引用错误3 第三方包——tinymce富文本编辑器4 verbose_name,verbose_name_plural5 搜索路径的添加6 auto_now_add 和 auto_now7 auth_user的表结构8 在 Django 中定义 ForeignKey 字段时&#xff0c;必须指定 on_del…

前端登录鉴权——以若依Ruoyi前后端分离项目为例解读

权限模型 Ruoyi框架学习——权限管理_若依框架权限-CSDN博客 用户-角色-菜单&#xff08;User-Role-Menu&#xff09;模型是一种常用于权限管理的设计模式&#xff0c;用于实现系统中的用户权限控制。该模型主要包含以下几个要素&#xff1a; 用户&#xff08;User&#xff09;…

全倒装COB超微小间距LED显示屏的工艺技术,相比SMD小间距有何优势

全倒装COB&#xff08;Chip On Board&#xff09;超微小间距LED显示屏&#xff0c;在工艺技术上的革新&#xff0c;相较于传统的SMD&#xff08;Surface Mount Device&#xff09;小间距LED显示屏&#xff0c;展现出了多方面的显著优势。 首先&#xff0c;全倒装技术极大地提升…

【踩坑】Vue3项目正常跑动后页面空白问题

近期踩了个坑&#xff0c;Vue3搭建的项目能够正常跑动&#xff0c;但是页面却是空白的&#xff0c;控制台也不报错&#xff0c;只留下一行警告&#xff1a; 发现是 router 入口文件&#xff08;一般是在 router 文件夹下的 index 里面&#xff09;的写法和 vite 版本不匹配的问…

代码随想录 刷题记录-24 图论 (1)理论基础 、深搜与广搜

一、理论基础 参考&#xff1a; 图论理论基础 深度优先搜索理论基础 广度优先搜索理论基础 dfs dfs搜索可一个方向&#xff0c;并需要回溯&#xff0c;所以用递归的方式来实现是最方便的。 有递归的地方就有回溯&#xff0c;例如如下代码&#xff1a; void dfs(参数) {…

基于 RocketMQ 的云原生 MQTT 消息引擎设计

作者&#xff1a;沁君 概述 随着智能家居、工业互联网和车联网的迅猛发展&#xff0c;面向 IoT&#xff08;物联网&#xff09;设备类的消息通讯需求正在经历前所未有的增长。在这样的背景下&#xff0c;高效和可靠的消息传输标准成为了枢纽。MQTT 协议作为新一代物联网场景中…