gcc make cmake ninja的区别

news2024/10/6 8:22:43

理清C++编译过程用到的工具概念

ref: 知乎

早先学C++的时候,因为只需要点击IDE的运行按钮,程序就可以跑起来,写过最复杂的只不过是几个文件的学生管理系统。

现在要重新拾起C++,看的项目和之前的不可同日而语,构建系统也复杂的多。要补课了。

GCC

一切的开始

1987年,被称作“最伟大的程序员” “自由软件之父” 的 Richard Stallman完成了C语言编译器初版,称之为GNU C Complier(GNU,GNU’s Not Unix! ,是一个操作系统)。后来GCC快速发展,除了能编译C,还能编译C++,Fortran,Pascal,Objective-C,Java以及Ada等语言。

make & makefile

新的麻烦!

一个软件工程的发展导致包含的源文件越来越多,但是GCC只能逐个手动编译。于是Richard Stallman和Roland McGrarth共同开发了make和makefile来解决这个问题。

  • make工具可以看作一个智能的批处理工具,它本身没有编译和链接的功能,而是用类似于批处理的方式,通过调用makefile中用户指定的命令来编译和链接。

  • makefile 是一个脚本文件,里面包含了调用 gcc (或者别的编译器)编译某个源文件的命令。

Cmake & CMakelist

更多的麻烦

本质上讲,makefile还是需要人工编写,当一个软件工程非常非常大时,这也是一个麻烦。另一方面,makefile中的脚本是平台相关的,在makefile发展过程中,陆陆续续出现了各种不同平台的makefile,有GNU make、QT 的 qmake,微软的 MSnmake,BSD Make(pmake),Makepp等等。这就导致如果换用不同的平台编译,就需要依据这个平台重新编写makefile,结果让麻烦变得更大。

于是,Cmake出现了。Cmake可以更加简单的生成makefile文件,最重要的是可以跨平台生成对应的makefile文件,不需要在进行修改。也就是说CMake是跨平台的。CMakelist文件则是Cmake工具生成makefile文件的依据,它还是需要我们自己写的。

Ninja

麻烦不止

到目前位置,软件工程变大的编译问题,跨平台问题暂时得到了解决,但还有一个问题尚未得到解决,那就是make执行速度慢的问题越来越严重了。

于是Google的一名程序员推出了注重速度的构建工具Ninja。Ninja启动编译的速度非常快,因为他舍弃了各种高级功能,语法和用法非常简单。

实际测试下,超过30000个源文件,Ninja可以在1秒钟内开始真正的构建,而使用makefile文件则需要10-20秒。

暂时完美的结局

只是暂时

Cmake可以生成 .ninja 和.makefile 的工具。因为担心很多人不熟悉makefile文件和ninja文件的写法,所以cmake只需要用户通过对源码文件的简单描述(就是CMakeLists.txt文件),就能自动生成一个project的makefile文件或者ninja文件,然后就可以通过ninja或者make进行启动编译了。

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

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

相关文章

最优化方法Python计算:牛顿算法

设函数 f ( x ) f(\boldsymbol{x}) f(x), x ∈ R n \boldsymbol{x}\in\text{ℝ}^n x∈Rn二阶连续可微,记 g ( x ) ∇ f ( x ) \boldsymbol{g}(\boldsymbol{x})\nabla f(\boldsymbol{x}) g(x)∇f(x), H ( x ) ∇ 2 f ( x ) \boldsymbol{H}(\…

【数据结构OJ题】用栈实现队列

原题链接:https://leetcode.cn/problems/implement-queue-using-stacks/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作。 出队操作: 当出队的栈…

ARFoundation避坑记录

网上很多人说这个要改成可选的,否则如果没有安装arcore就会自动弹窗,但是如果关闭了,确实不会弹窗了,但是检测设备的代码也不能完美执行了,如果设备安装了arcore还好,如果没有安装测无法检测。 如果不想有…

常见的CRM系统报价

一个CRM系统大概多少钱?CRM系统的价格因为不同的厂商、功能、部署方式、用户数等因素而有很大的差异,没有一个固定的标准。但是,我们可以根据一些常见的CRM软件的报价,对CRM价格有一个大致的了解。 一、CRM的部署方式 CRM系统的…

填充柄功能

单元格右下角十字符号 顺序式填充 输入1,2,直接拉取即可实现顺序1到10. 复制式填充 CtrlD或者拉取,选择右下角复制单元格。 规律式填充 输入星期一,星期二,下拉一直可以到星期日 自定义填充 选择文件-》选项-》自定义序列 输…

AI工程师招募;60+开发者AI工具清单;如何用AI工具读懂插件源码;开发者出海解读;斯坦福LLM课程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 一则AI工程师招募信息:新领域需要新技能 Vision Flow (目的涌现) 是一家基于 AGI 原生技术的创业公司,是全球探…

CSGO饰品价格会一直下跌吗?市场何时止跌回升?

最后一届巴黎major终于落下帷幕,Vitality小蜜蜂2-0战胜GL成功赢下本次Major冠军,也是首次夺得Major冠军!有人欢喜有人忧啊,csgo搬砖的饰品商人们一点也高兴不起来。 4月-5月,csgo皮肤饰品已持续走低快两个月了。手里满…

OPTEE3.17+ubuntu20.04+qemu_v8搭建OPTEE开发环境

参考文章: https://blog.csdn.net/capodexi/article/details/123548850 https://blog.csdn.net/qq_42557044/article/details/130973200 https://blog.csdn.net/zhuwade/article/details/125513873 https://zhuanlan.zhihu.com/p/521196386 https://blog.csdn.net/…

wsl2 安装cuda

1 设置为清华源 首先登录wsl 直接命令 wsl 就行 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /e…

AVL树的讲解

算法拾遗三十八AVL树 AVL树AVL树平衡性AVL树加入节点AVL删除节点AVL树代码 AVL树 AVL树具有最严苛的平衡性,(增、删、改、查)时间复杂度为O(logN),AVL树任何一个节点,左树的高度和右树的高度差…

为什么美元美债没有出现死亡螺旋?

号外:刘教链最新文章,欢迎点击阅读: 公众号「刘教链内参」8.18发表:《内参:SEC批准ETF将推高大饼至15-18w$ ?》。 公众号「刘教链Pro」8.18发表:《大饼插爆两万五》。 * * * * * * 如果我们把美…

Linux系统基础服务启动的方法

服务,其实就是运行在操作系统后台的一个或者多个应用程序,为计算机系统或用户提供某项特定的服务。Linux系统运行的绝大多数服务都是需要安装才有的,例如FTP服务、httpd服务、MySQL、redis、Zookeeper、rabbitmq、vsftpd等等,那么…

面试题 ①

1、请讲一下常见的SQL优化方法(至少10条) 1.尽量避免使用子查询 虽然在 mysql5.6 版本之后对 select 的子查询用 join关联方式 做了优化,但是update/delete子查询依然先查外表再查内表,当外表过大时查询速度会很慢;因此…

浙大数据结构第八周之08-图7 公路村村通

题目详情: 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M&#xff08…

Linux 应急响应命令总结【持续更新】

系统基本信息 CPU 信息 CPU 信息: lscpu操作系统信息 操作系统信息: uname -a操作系统信息: cat /proc/version模块信息 模块信息: lsmod账户信息 系统所有账户 系统所有账户: cat /etc/passwd超级权限账户…

【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

可能存在无限循环的技巧题 202. 快乐数数学分析 1015. 可被k整除的最小整数数学分析 202. 快乐数 题目链接:202. 快乐数 题目内容: 理解题意,快乐数就是重复每位数的平方之和得到的新数的过程,最终这个数能变成1。变成1以后&…

STM32 串口复习

按数据通信方式分类: 串行通信:数据逐位按顺序依次传输。传输速率较低,抗干扰能力较强,通信距离较长,I/O资源占用较少,成本较低。并行通信:数据各位通过多条线同时传输。 按数据传输方向分类&…

04_Redis与mysql数据双写一致性案例

04——redis与mysql数据双写一致性 一、canal 是什么 canal[ka’nel,中文翻译为水道/管道/沟渠/运河,主要用途是用于MySQL数据库增量日志数据的订阅、消费和解析,是阿里巴巴开发并开源的,采用Java语言开发; 历史背景是早期阿里巴巴因为杭州和…

你知道CSGO转区内购吗?了解下内购系统!

哈喽,大家好,我是童话姐姐,这两天群里很多人都在问关于内购的事情,今天就专门给大家讲一下关于内购的一些情况吧。 1、首先什么是转区内购? 顾名思义,内购就是在游戏内部的一个购买行为,csgo内购自然就是…

MATLAB打开excel读取写入操作例程

本文使用素材含代码测试用例等 MATLAB读写excel文件历程含,内含有测试代码资源-CSDN文库 打开文件 使用uigetfile函数过滤非xlsx文件,找到需要读取的文件,首先判断文件是否存在,如果文件不存在,程序直接返回&#x…