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 FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子