gcc make cmake ninja的区别

发布时间 2023-08-19 15:17:15作者: HeyMeteor

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

ref: GCC、CMake、CMakelist、Make、Makefile、Ninja啥关系?一图讲透! - 知乎 (zhihu.com)

早先学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进行启动编译了。