架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 528|回复: 0

【转】GCC、CMake、CMakelist、Make、Makefile、Ninja 介绍

[复制链接]
发表于 2024-7-9 20:44:28 | 显示全部楼层 |阅读模式
一、GCC的诞生!

1985年,一个伸手不见五指的黑夜,一位满脸胡须、五短身材、头发长乱的怪人开始编写一套C语言编译器。这个怪人后来被称作“最伟大的程序员”、“自由软件之父”,他就是 Richard Stallman。经过2年时间没日没夜的苦练,胡须更长、头发更乱的Richard Stallman完成了C语言编译器初版,称之为GNU C Complier,也就是现在大名鼎鼎GCC的来源。后来GCC快速发展,现在GCC除了能编译C语言,还能编译C++、Fortran、Pascal、Objective-C、Java以及Ada 等语言。上世纪80、90年代,个人计算机CPU频率、硬盘大小、内存大小都是以MB为单位,甚至KB为单位,需要编译的程序文件个数较少,用GCC命令也足以应对。

二、新的麻烦出现了! (make & makefile)

随着计算机的性能提升和普及,一个软件工程包含的源文件越来越多,比如linux,采用gcc命令逐个手动去编译,很容易混乱而且工作量大,会让人抓狂。

于是乎,Richard Stallman和 Roland McGrath 共同开发了make 和makefile来解决这个问题。make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。makefile是什么?makefile就是一个脚本文件,简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

三、新的麻烦又出现了!(Cmake & CMakelist)

makefile在一些简单的工程下,完全可以人工手写,但是当工程非常大的时候,手写makefile也是非常麻烦。而且陆陆续续出现了各种不同平台的makefile,有GNU make、QT 的 qmake,微软的 MSnmake,BSD Make(pmake),Makepp等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作,如果换了个平台makefile又要重新修改。

于是乎,这时候就出现了Cmake这个工具,Cmake就可以更加简单地生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。cmake正是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。到最后CMakeLists.txt文件谁写啊?当然是你自己手写的。

四、新的麻烦又又又出现了!(Ninja)

随着软件工程越来越大,越来越复杂,make的执行速度慢的问题越来越严重了。

于是乎,Google的一名程序员推出的注重速度的构建工具Ninja。Ninja 舍弃了各种高级功能,语法和用法非常简单,给它指定好了具体详细要做什么,所以启动编译的速度非常快。根据实际测试:在超过30,000个源文件的情况下,也能够在1秒钟内开始进行真正的构建。与之相比,通过资深工程师进行编写的Makefiles文件也需要10-20秒才能开始构建。

五、目前完美的结局!

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


5分钟理解make/makefile/cmake/nmake

最近,有没有被make、cmake、makefile... ... 这些东西绕晕了,看看下面的文章,也许就可以理解清楚了。

1. gcc
它是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

我们的程序只有一个源文件时,直接就可以用gcc命令编译它。

可是,如果我们的程序包含很多个源文件时,该咋整?用gcc命令逐个去编译时,就发现很容易混乱而且工作量大,所以出现了下面make工具。

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

3. makefile
这个是啥东西?

简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

makefile在一些简单的工程完全可以人工拿下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改,这时候就出现了下面的Cmake这个工具。

4. cmake
cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他更牛X功能,就是可以跨平台生成对应平台能用的makefile,我们就不用再自己去修改了。

可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

5. CMakeList.txt
到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

6. nmake
nmake又是啥东西?

nmake是Microsoft Visual Studio中的附带命令,需要安装VS,实际上可以说相当于linux的make,明白了么?

转自:

https://geekisland.cn/forums/1936.html
https://zhuanlan.zhihu.com/p/666717489
https://zhuanlan.zhihu.com/p/545075915





上一篇:ERP 金蝶云星空(一)简单了解
下一篇:Rocky Linux 9 找不到包:No match for argument: xxx
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-10-25 01:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表