为什么会出现cmake?

news2025/1/4 16:22:34

为什么会出现cmake

1、 什么是CMake

        -- 是一个项目构建工具,其实cmake和makefile是差不多的,只不过cmake更高级,可以跨平台使用,并且使用起来更加灵活,更符合逻辑。

2、为什么会出现cmake?

c++程序的编译流程:

编译流程分为四个阶段:预处理、编译、汇编、链接

以Linux系统下g++编译为例:

通过g++的选项可以查看过程中的每一步:

alt text

-- 预处理: 处理一些#号定义的命令或语句(如#define、#include、#ifdef等),生成.i文件

-- 编译:进行词法分析、语法分析和语义分析等,生成.s的汇编文件

-- 汇编:将对应的汇编指令翻译成机器指令,生成二进制.o目标文件

-- 链接:调用链接器对程序需要调用的库进行链接。链接分为两种

-- 静态链接

  • 在链接期,将静态链接库中的内容直接装填到可执行程序中。

  • 在程序执行时,这些代码都会被装入该进程的虚拟地址空间中。

-- 动态链接

  • 在链接期,只在可执行程序中记录与动态链接库中共享对象的映射信息。

  • 在程序执行时,动态链接库的全部内容被映射到该进程的虚拟地址空间。其本质就是将链接的过程推迟到运行时处理


      举个例子,现在仅仅给你一个main文件,里面只声明了add函数并调用了add函数,但是不包括add函数的实现,现在要对这个main文件进行编译运行,那么会走到哪一步?前三步走完都不会报错,直到遇到链接,才会报错,因为找不到add函数的实现。

      你可以这样理解:每个文件都是独立编译的,直到链接开始前,这些文件被处理成.o文件,里面是一些机器码,等到链接的时候,这些文件才被组合起来。声明相当于你提前向你的程序做出了一份承诺:我现在有一个add函数,你在main文件里只管调用就行,我已经在其它文件里实现了!于是,main文件转头忙活自己的事,尽管它没见过add函数的实现,因为你已经向它做出了承诺。但是等到链接的时候才发现:根本没有add函数的实现。所以报错


程序编译演化史

        写一份main文件,按照上面的流程,使用g++一步一步编译看看每一步会输出什么文件。你在整个过程中遇到的命令大概如下:

g++ -E main.cpp -o main.i
g++ -E add.cpp -o add.i
g++ -S main.i -o main.s
g++ -S add.i -o add.s
g++ -c main.s -o main.o
g++ -c add.s -o add.o
g++ main.o add.o -o main

当然,一般情况下我们会这么编译:

g++ main.cpp add.cpp -o main

现在引入一个问题:你有一个大的工程文件,里面有上百个cpp文件,分别存放在不同的目录中。这种情况如果用g++编译,其难度可想而知。于是,可以得出一个结论:g++对于大型工程并不是特别好用。

接着我们尝试做一些改进。

        g++敲命令去编译,对于大型文件简直就是噩梦,每次编译都要敲一大串命令。但是写成文件总比敲命令要方便,要是把这些命令写成文件,每次编译的时候直接复用这个文件就好了。于是,Makefile诞生了。

上面的一大串命令写成对应的Makefile文件是这样的:

main: main.o add.o
	g++ main.o add.o -o main
main.o add.o: main.s add.s
	g++ -c main.s -o main.o
	g++ -c add.s -o add.o
main.s add.s:main.i add.i
	g++ -S main.i -o main.s
	g++ -S add.i -o add.s
main.i add.i: main.cpp add.cpp
	g++ -E main.cpp -o main.i
	g++ -E add.cpp -o add.i

Makefile底层执行逻辑是只执行第一个命令,也就是:

main: main.o add.o
	g++ main.o add.o -o main

但是由于没有main.o add.o ,所以才会向下执行。

嗯,看起来Makefile是g++的升级,我们可以借助Makefile文件实现相对于直接使用g++更快的编译。我们的问题被解决了吗?解决了一部分,但是还没完全解决。这次的问题出在跨平台上。

g++是Linux平台下的编译器,如果你使用win下的Visual Studio开发代码,它使用的是MSVC编译器,Makefile并不适用这种编译器,它跟Makefile相对应的文件是.sln文件。也就是说尽管大家都要经过预处理,编译,汇编,链接这四个步骤,但是大家走的路是不相同的。

于是,CMake就出现了。

Cmake本质上帮我们做的事情就是针对于不同的编译器,生成相对应的编译命令。针对Linux下的g++就是Makefile文件,针对win下的MSVC就是.sln文件。

CMake相当于在用户和操作系统上的编译器之间做了一层抽象,用户借助于CMake,不用关心自己的操作系统上用了什么编译器就能直接完成工程的快速编译。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「字符串」详解Trie(字典树|前缀树)并实现对应的功能 / 手撕数据结构(C++)

概述 在浏览器搜索栏里输入几个字,就弹出了以你的输入为开头的一系列句子。浏览器是怎么知道你接下来要输什么的? 来看看字典树干了什么。 字典树是一种高效记录字符串和查找字符串的数据结构。它以每个字符作为一个节点对字符串进行分割记录&#xff0c…

Flink-DataWorks第二部分:数据集成(第58天)

系列文章目录 数据集成 2.1 概述 2.1.1 离线(批量)同步简介 2.1.2 实时同步简介 2.1.3 全增量同步任务简介 2.2 支持的数据源及同步方案 2.3 创建和管理数据源 文章目录 系列文章目录前言2. 数据集成2.1 概述2.1.1 离线(批量)同步…

【文献阅读】DAVE

核心思想 文章的核心思想是提出了一种名为DAVE(Detect-and-Verify Paradigm for Low-Shot Counting)的少样本计数方法。DAVE旨在通过一个新颖的检测和验证范式来提高低样本情况下的对象计数性能。这种方法特别关注在只有少量标注样本(少样本…

OpenAI Gym: Understanding `action_space` notation (spaces.Box)

题意:OpenAI Gym: 理解action_space表示法(spaces.Box) 问题背景: I want to setup an RL agent on the OpenAI CarRacing-v0 environment, but before that I want to understand the action space. In the code on github line…

【Nuxt】Layout 布局和渲染模式

NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面&#xff0c;其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…

比特币使用ord蚀刻符文---简单笔记

说明 毕竟符文热度过了&#xff0c;今年四月份做的笔记分享出来 蚀刻符文需要先同步完区块数据&#xff0c;和index文件&#xff0c;不然蚀刻会失败&#xff0c;在testnet和signet网络也一样。 创建钱包&#xff08;会输出助记词&#xff09;&#xff1a; ord --bitcoin-da…

【系统架构设计师】二十五、大数据架构设计理论与实践②

目录 四、 Kappa架构 4.1 Kappa架构介绍 4.2 Kappa架构的优缺点 4.3 常见Kappa 架构变形 4.3.1 Kappa 架构 4.3.2 混合分析系统的Kappa 架构 五、Lambda 架构与 Kappa 架构的对比和设计选择 5.1 Lambda架构与Kappa 架构的特性对比 5.2 Lambda架构与Kappa 架构的设计选…

2024最新数据库管理工具 Navicat Premium 简体中文版安装

Navicat Premium 是一款由 PremiumSoft 公司开发的多数据库管理工具。它支持多个数据库系统&#xff0c;包括 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 等&#xff0c;使用户能够在一个平台上管理和操作多种数据库&#xff0c;简化了数据库管理任务…

软考基本介绍

一,基本了解 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软件考试&#xff09;为国家级考试。 考试设置了27个专业资格&#xff0c;涵盖5个专业领域&#xff0c; 3个级别层次&#xff08;初级、中级、高级&#xff09;。 中国计算机技术职业…

品牌网络维权面临的挑战

在品牌治理渠道的过程中&#xff0c;知识产权的运用至关重要。然而&#xff0c;现实情况却不尽如人意&#xff0c;大量的侵权链接涌现&#xff0c;而下架速度迟缓&#xff0c;致使品牌渠道陷入混乱。店铺侵权背后的利益驱动是低价销售吸引消费者&#xff0c;这不仅损害品牌形象…

【HarmonyOS NEXT星河版开发学习】综合测试案例a-京东登录页面

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 该案例有一些难度&#xff0c;将前面所学到的全部知识点做了一个全面的总结&#xff0c;代码量也不是很少。里面的一些细节一定要仔细…

MSR020/MSR040低温漂、低功耗电压基准

MSR020/MSR040 是低温漂、低功耗、高精度 CMOS 电压基准&#xff0c; 具有 0.05% 初始精度和低功耗的特点。 该器件的低输出电压迟滞和低长期输出电压漂移的 特性&#xff0c;可以进一步提高稳定性和系统可靠性。 此外&#xff0c;器 件的小尺寸和低工作电流的特性使其非…

lvs-nat模式原理及部署方法

一、环境准备 1.准备三台rhel9服务器 服务器名称 主机名 ip地址备注LVS调度服务器lvs.timinglee.org eth0:172.25.254.100&#xff08;外网&#xff09; eth1:192.168.0.100(内网) 关闭selinux和防火墙webserver2网站服务器webserver1.timinglee.orgeth0&#xff1a;192.168.…

【竞技宝】奥运会:法国国奥淘汰埃及国奥晋级决赛

法国国奥在巴黎奥运会男足半决赛跟埃及国奥相遇&#xff0c;赛前大部分球迷和媒体&#xff0c;都一边倒看好法国国奥能轻松获胜。首先&#xff0c;法国国奥整体实力高出一个档次。最后&#xff0c;法国国奥坐拥主场作战的优势。所以&#xff0c;法国国奥正常发挥的话&#xff0…

五条关于有效部署和维护MQTT解决方案的最佳实践

节选自论文《Message Queuing Telemetry Transport (MQTT) 在森林产品应用中的分析与概述》&#xff08;Analysis and Overview of Message Queuing Telemetry Transport (MQTT) as Applied to Forest Products Applications&#xff09;&#xff0c;发表于《IEEE TRANSACTIONS…

使用Cisco进行模拟配置OSPF路由协议

OSPF路由协议 1.实验目的 1&#xff09;理解OSPF 2&#xff09;掌握OSPF的配置方法 3&#xff09;掌握查看OSPF的相关信息 2.实验流程 开始 → 布置拓扑 → 配置IP地址 → 配置OSPF路由并验证PC路由的连通性 → 查看路由器路由信息 → 查看路由协议配置与统计信息 → 查看O…

锡耶纳大学与 NocoBase:教育管理系统的全新篇章

关于锡耶纳大学 锡耶纳大学&#xff08;意大利语&#xff1a;Universit degli Studi di Siena&#xff0c;简称UNISI&#xff09;建于 1240 年&#xff0c;是欧洲最古老的大学之一。如今&#xff0c;锡耶纳大学以其法学院和医学院闻名。这所著名的大学坐落在意大利托斯卡纳的中…

Redis和数据库一致性如何保证

三种经典的缓存模式 Cache-Aside Pattern&#xff08;旁路缓存模式&#xff09;Read-Through/Write-through&#xff08;读写穿透&#xff1a;和1类似&#xff09;Write-behind &#xff08;异步批量从缓存写数据库&#xff09; 旁路缓存模式 读流程 读的时候&#xff0c;先…

HTML5+CSS3笔记(Xmind格式):第四天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; HTML5CSS3知识总结&#xff1a; 媒体查询&#xff1a; 1.媒体查询格式&#xff1a;media 设备类型 and 设备特性 2.screen&#xff1a;设置屏幕 3.max-width(最大宽度),min-width(最小宽度) 4.可以通过媒体…

阿里国际推出首个专业版AI Search,为什么它会是下一个B2B谷歌?

点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 经历过「千模大战」的喧嚣&#xff0c;一年半之后&#xff0c;生成式 AI 的应用层创新终于步入爆发期。 年初的 Sora 激起一阵 AI 视频生成的浪潮。涟漪未散&#xff0c;OpenAI 新的 SearchGPT 又燃起了 A…