CMake 生成器

在这里插入图片描述
关于 CMake 的讨论已有不少,因为 CMake 无疑是一个伟大的工具。如果你搜索“CMake”,你肯定会看到这样一句话:“CMake 不是一个构建系统,而是一个构建系统生成器”。因此,本篇文章的内容主要围绕什么是 CMake 生成器,为什么 CMake 支持这么多生成器,以及在开发中何时使用。但在开始探讨这些问题之前,我们先复习一下 CMake 构建进程。

在这里插入图片描述上图中的配置(Configure)步骤仅与 GUI 构建相关。在使用 CMake 命令行时,生成(Generate)命令在内部处理配置步骤。但是生成步骤具体是做什么呢?请看下文。

CMake 生成器

什么是 CMake 生成器?从上图可以看出,本机构建工具负责实际编译源文件。这些构建工具要求它们的输入以特定的形式呈现,例如,Makefile。CMake 生成器负责为本机构建工具创建此输入。在生成步骤中,只有一个 CMake 生成器参与构建输出的创建。

生成器的类型

总的来说,有两种 CMake 生成器。

在这里插入图片描述

命令行构建工具生成器

这类生成器支持命令行构建工具。CMake 是从一个命令行调用的,该命令行的环境已经为所选的编译器和构建工具进行了配置。

在这里插入图片描述
Make 是一个著名的 Unix 实用程序,Makefiles 是它的输入。也有文章已深入探讨为何 CMake 完胜 Make。一些非标准的 Makefiles,受其他平台的程序支持。CMake 支持的一些非标准组件包括:

  • Borland Makefiles
  • MSYS Makefiles
  • MinGW Makefiles
  • NMake Makefiles
  • NMake Makefiles JOM
  • Watcom WMake

对于这些不同的 Makefiles,实际编译中使用的工具是不同的。例如,在Borland Makefile 中,用于编译 C++ 文件的编译器称为 bcc32。而 Nmake,是与微软 Visual Studio 捆绑的 make 工具,使用的编译器则是微软 C++ 编译器,cl。

尽管 make 已经存在很长时间了,但是维护 Makefiles 的复杂性促使了其他构建系统的开发——其中最成功的是 Ninja。Ninja 代替 make 的独特卖点,在于 Ninja 支持并行构建。在 Ninja 中,构建总是并行运行,而 make 依赖于底层编译器支持的标志来实现这一点。由于 Ninja 是一个现代工具,其暗含的意思是拥有多核 CPU,且所有 CPU 都可以在构建过程中使用,从而提高吞吐量。另外,Ninja 确保在命令完成前缓存其输出,这让并行编译期间出现的错误或失败显而易见。(如果你想进一步减少编译时间,可以查看 Incredibuild 解决方案。这个方案打破了一个系统的局限,让构建在本地网络甚至云中的空闲 CPU 上并发分布进行,因此构建速度非常快。)

构建工具生成器

夜间自动构建,人工干预最少,命令行构建工具生成器显然是最佳选择。然而,当开发人员试图使用集成开发环境调试程序时,从源文件和 CMakeLists.txt这些熟悉的开发环境中进行,调试难度将大大降低。CMake 支持以下 IDE:

  • Visual Studio (从版本 6 到版本16)
  • Xcode
  • CodeBlocks
  • CodeLite
  • Eclipse CDT
  • Kate
  • Sublime Text 2

CMake 生成器表达式

在编译器的世界里,表达式是需要计算的东西。例如,考虑下面的 C++ 行,其中包含三个变量 a、b 和 c:a = b + c;

这是一个赋值语句,在赋值的右侧包含一个表达式 b+c。表达式 b+c 将被求值,其值将被赋给变量 a。

CMake 有一种语言可以编写 CMakeLists.txt 文件(以及编写脚本和模块)。当然,像你我这样的凡人不需要理解 CMake 语言就可以使用 CMake。生成器表达式用于 CMakeLists.txt 文件或其他地方(一些突出的地方,凭借我们有限的 CMake 语言理解不了)。说实话,我自己也不太喜欢生成器表达式,我相信可读性应该优于简洁性。所以,如果你看到一些类似的东西:
$abc:xyz

这意味着,如果生成器表达式 abc 的计算结果为正确,则生成器表达式的值为 xyz,否则为空字符串。让我们举个例子来说明这一点。将以下内容另存为 CMakeLists.txt 文件。
cmake_minimum_required(VERSION 3.8)
project(TestingGenerators)
message(STATUS “This message can be seen during generation”)
add_custom_target(print ${CMAKE_COMMAND} -E echo $<0:hello> $<0:world>)

先用这个命令生成:
cmake -S. -BBuild -G “Ninja”

然后构建自定义目标:
cmake –build . –target print

此时不应该得到任何输出。现在将上面的文件更改为:
add_custom_target(print ${CMAKE_COMMAND} -E echo $<1:hello> $<1:world>)

在命令行上,应该显示“hello world”。1 表示计算结果为正确,因此有一些输出,而 0 则表示计算结果错误,因此没有输出。这是通过一篇普通的博客文章可以解释的最低限度。如果你对生成器表达式感兴趣,我建议可以阅读 CMake 文件。

结语

CMake 有一些非常强大的功能,但很少使用。在本文中,我们研究了 CMake 生成器和 CMake 生成器表达式。希望这些内容能激发你的兴趣,如果你有一定冒险精神,不妨勇敢地探索 CMake,那定是一场奇妙的旅行。祝大家“旅途”愉快!

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

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

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

相关文章

低代码开发平台优势揭秘 | 提升应用程序开发效率

低代码开发平台是指不用编码或少量编码即可快速产生应用程序的开发平台。依据平台的可视化开发方式&#xff0c;具有不同经验水准的开发者能通过图型操作面板、系统软件拖拽组件和模型驱动思维创建网页和移动应用程序。低代码开发平台在如今企业数字化的蓬勃发展中发挥着不可替…

【Leetcode每日一题】DP35 二维前缀和(难度⭐⭐)(26)

1. 题目解析 题目链接&#xff1a;DP35 【模板】二维前缀和 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于计算题目所给二维区间数组元素和返回即可。 2. 算法原理 和上题了类似的方法&#xff0c;使用dp数组来保存[1…

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…

风险评估是什么意思?与等保测评有什么区别?

最近看到不少小伙伴在问&#xff0c;风险评估是什么意思&#xff1f;与等保测评有什么区别&#xff1f;这里我们就来简单聊聊。 风险评估是什么意思&#xff1f; 风险评估是指对某个特定领域或项目进行全面分析和评估&#xff0c;以确定可能存在的潜在风险和危害&#xff0c;并…

Vue-02

开发者工具 安装插件&#xff0c;用于调试 Vue 应用。 https://chrome.zzzmh.cn/index 搜索 Vue &#xff0c;下载 Vue.js Devtools &#xff0c;此插件可以帮助更新信息&#xff0c;而不通过控制台更新&#xff0c;更方便调试。 注&#xff1a;安装插件后&#xff0c;记得在插…

【仿真基本功】【PyTorch】从头安装PyTorch(GPU版本)【2024/03/03更新】

【仿真基本功】【PyTorch】从头安装PyTorch&#xff08;GPU版本&#xff09;【2024/03/03更新】 安装步骤1. 安装Anaconda2. 查看显卡对CUDA版本的支持3. 查看PyTorch的安装需求4. 安装PyTorcha) 配置新环境b) 进入新环境c) 按照CUDA版本要求&#xff0c;必须小于等于显卡支持的…

MyBatis操作数据库(注解方式)

MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&#xff0c;可以用来简化数据库的操作&#xff01; 创建工作&#xff1a; 创建Spring Boot工程&#xff0c;并导入MyBatis的起步依赖&#xff0c;Mysql的依赖等 配置数据库&#xff1a; #配置数据库的连接字符串 s…

demo型xss初级靶场

一、环境 XSS Game - Ma Spaghet! | PwnFunction 二、开始闯关 第一关 看看代码 试一下直接写 明显进来了为什么不执行看看官方文档吧 你不执行那我就更改单标签去使用呗 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二关…

【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0

目录 一、 Kubernetes 的概述 二、服务器配置 2.1 服务器部署规划 2.2服务器初始化配置 三、安装Docker/kubeadm/kubelet【所有节点】 3.1 安装Docker 3.2 添加阿里云YUM软件源 3.3 安装kubeadm&#xff0c;kubelet和kubectl 四、部署Kubernetes Master 五、部署Kube…

【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

程序环境和预处理(2)

文章目录 3.2.7 命名约定 3.3 #undef3.4 命令行定义3.5 条件编译3.6 文件包含3.6.1 头文件被包含的方式3.6.2 嵌套文件包含 4. 其他预处理指令 3.2.7 命名约定 一般来讲函数和宏的使用语法很相似&#xff0c;所以语言本身没法帮我们区分二者&#xff0c;那我们平时的一个习惯是…

JavaWeb Tomcat启动、部署、配置、集成IDEA

web服务器软件 服务器是安装了服务器软件的计算机&#xff0c;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让用户通过浏览器来访问这些项目。 Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序…