CMake: 在构建世界掀起风暴

2024-03-12 14:12

本文主要是介绍CMake: 在构建世界掀起风暴,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述由简至繁,以小见大。首先,让我们从标准的 Gartner 技术成熟度曲线开始,了解 CMake 的发展,感受 CMake 对行业的深远影响。

在这里插入图片描述
图片来源:Gartner (我在原图基础上增加了年份)

CMake 的开发从1999年开始,最初的版本由 Kitware 在 2000 年发布。在接下来的五年里,CMake 被公认为是构建大型开源和专有项目的有效解决方案。2006 年,KDE 成功迁移到 CMake,并留下了老化的自动工具构建系统。这对 CMake 来说是一个重大的胜利,在这个时期,CMake 处于过高期望的高峰期(Inflated expectations)。大约过了十年后,CMake 3.0 才发布。在这期间,CMake 经历了泡沫出现的低谷期(Trough of Disillusionment)。现代CMake(CMake 3.0 之后的版本)抛弃了许多经典 CMake 的反模式,并进入稳步爬升的光明期 (Slope of Enlightement)。从 Visual Studio 2017 到 Qt6.0 开始支持 CMake,我相信,CMake 目前已经达到了实质生产的高峰期(Plateau of Productivity)。

CMake 风暴已经酝酿了二十年!现在,CMake 已到达实质生产的高峰期,技术成熟曲线暂时告一段落。接下来让我们看看一些成功的案例,了解为何现代 CMake 不容轻视。

Visual Studio 和 CMake

在这里插入图片描述

在长期的项目运行中,维护 Visual Studio 项目和解决方案的健全性是一件痛苦的事(委婉的说法)。维护一个只在 Visual Studio 2010 中编译的分支,为客户提供到该产品后续版本的迁移路径,这种情况并不少见。产品版本不同,编译的 Visual Studio 版本也不同,且具有多个分支,这类产品的维护堪称一场噩梦。因此,使用 CMake 生成正确的 Visual Studio 项目/解决方案像是有如天助。从 VS2017 开始,Visual Studio 与现代 CMake 捆绑(Incredibuild 也与 Visual Studio 捆绑)。因此,遵循 CMake – Visual Studio 工作流变得更为简单,大型项目亦是如此。CMake 也支持 C# 语言的项目生成和构建,因此我希望 CMake Visual Studio 在 Windows 世界中会变得更加流行。下面总结了 Visual Studio CMake 对项目的意义:

  • 避免在不同分支中维护多个项目和解决方案,CMakefiles.txt 文件中可以自动生成。
  • 新版本的 Visual Studio 不需要迁移解决方案和项目,Visual Studio 最新版本操作简单。
  • 由于没有需要合并的项目或更改的解决方案,因此合并不同分支的并行工作变得更加简单。
  • 不再需要维护批标准化或 Perl 脚本,因为 CMake 可以自动构建。
  • 在 CMake 中构建的 CI/CD 管道比基于自制脚本的定制解决方案更易于维护。

Visual Studio, CMake 和 WSL2

Visual Studio 2019 为 Linux 2 的 Windows 子系统带来的集成量是惊人的。不必离开熟悉的 Windows 环境,开发人员可以即刻启动 CMake – Visual Studio 项目,使用 Clang 或 GCC 进行交叉编译,然后调试 WSL 机器上运行的应用程序。当项目变得稳定时,可以消除交叉编译的麻烦,因为基于 CMake Visual Studio 的项目需要在本机环境中正确配置和构建。

CLion 和 CMake

在这里插入图片描述

CLion 是 Jetbrains旗下专门开发针对 C 以及 C++ 的跨平台IDE。CMake 是最深入集成到 CLion 中的项目模型。CLion 中的 CMake 智能支持是使用体验最佳的编辑器,这让 CMake 构建成为一种乐趣。

Qt6.0 和 CMake

在这里插入图片描述
2020 年 12 月,“下一代 Qt” Qt6.0,正式发布。Incredibuild 与 Qt 完美集成,加快编译速度 (详情请阅读链接内容)。Qt6.0 的亮点之一是“支持 CMake”。这是 Qt 员工的原话:“使用行业标准的构建系统,以其广泛的功能集、大型生态系统来构建 Qt 应用程序。” 在管道中,Qt – CMake 集成的过程很长。

不知大家还记得 QMake 吗?尽管它仍然受支持,但建议使用 CMake 来构建基于 Qt6.0 的项目。那么庞大的 Qt 源代码本身呢?它也是用 CMake 构建的吗?我做了一些研究,偶然发现了 Jörg Bornemann 的博客。Qt6.0 源代码目前使用 CMake 进行构建。这也是说明 Qt-CMake 集成成功的最佳证据!

Vcpkg 和 CMake

(本片博客的内容绝对真实,这部分也是我和一位建筑师之间发生的真人真事。免责声明:没有建筑师在生产过程中受到伤害)

在一个繁忙的星期一上午,我被拉去和我们公司一个高级项目的建筑师开会。我负责建立这个项目的建设管道,一切进展顺利。为了满足一个新的需求,这个项目被迫将 OpenSSL 加入到代码库中,他们希望每晚构建都能启动并运行。但就在昨天,Vcpkg 紧急救援! Vcpkg 安装 OpenSSL 时,甚至显示出下列内容:

The package openssl is compatible with built-in CMake targets:

find_package(OpenSSL REQUIRED)

target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto)

这就是标准化的力量!Vcpkg 给出了如何将 OpenSSL 集成到构建中的有用提示,工作在一小时内就高效完成了!

VSCode 和 CMake

微软的 Visual Studio 代码是一个开源的跨平台集成开发环境,其扩展机制对 CMake 有很大的帮助。使用 VS 代码在 CMake 中进行构建,很轻松地就能建立一个 C++ 跨平台的项目。甚至可以使用 CMake:debug 这个优秀的轻量级编辑器调试代码。

CMake.js

Node.js 本机插件通常使用 node-gyp 构建,但是 CMake.js 公司允许使用 CMake 构建插件。这对本地开发人员更为友好,因为他们不必再为另一个构建系统而痛苦不已。

结论

现代 CMake 是一个伟大的构建生成系统。多年来,许多著名的开源项目都采用了现代 CMake,因为其历经时间考验,功能强大,且支持所有的主要平台(对比 Make 的局部支持)。

点击了解 Incredibuild 加速 C/C++ 构建编译的解决方案,并获取试用 License!

这篇关于CMake: 在构建世界掀起风暴的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/801521

相关文章

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和