Skip to content
On this page

GCC、MAKE和CMAKE


软件版本硬件版本更新内容
首次编写

1、GCC、MAKE和CMAKE的关系

关系图

说明:

  1. cmake会根据Cmakelist.txt生成makefile文件
  2. make会解析Makefile从而生成一条条的gcc编译指令
  3. make调用gcc生成目标文件

整个编译任务由三者共同协作来完成,下面具体介绍一下这三个工具,从而说明为什么需要三个工具才能完成整个编译任务。

2、GCC

GCC是众多GNU自由软件中的一个,是一支持C/C++、Object-c、Go等很多的编程语言的编译器。GCC本质上一个编译套件,包括编译过程中各个功能模块,如ar、ld等等。也就是GCC是包括编译前端和后端的编译套件。

当我们的项目很小,只有一个或者几个文件时,直接可以通过GCC来完成编译工作:

c
gcc [-c|-S|-E] [-std=standard]
    [-g] [-pg] [-Olevel]
    [-Wwarn...] [-Wpedantic]
    [-Idir...] [-Ldir...]
    [-Dmacro[=defn]...] [-Umacro]
    [-foption...] [-mmachine-option...]
    [-o outfile] [@file] infile...

最后的infile就是我们的源文件,但是当项目很大时,我们的源文件很多时,也就是意味着需要在infile那个文件输入大量的源文件名,而且这个源文件其中一些可能是生成一些库,这样就会需要多条gcc指令来完成,后期如果有新的源文件加入时也需要同时变化编译指令,如果修改了一个源文件,也需要全编译整个项目,这显然是不方便的,在这个背景下出现了make工具。

3、MAKE

MAKE同样属于GNU自由软件,它工作的本质是根据Makefile的信息来调用gcc执行编译工作,也就是说在我们的项目中我们只写好Makefile文件就可以轻松实现编译工作,而且后期如果加入新的源文件,也只需要在Makefile加入就可以了,源文件发生修改,make也只会找与发生修改的文件相关的模块进行编译,而不会编译整个项目,而且我们在Makefile中还可以加入很多类似清理编译生成的.o文件的伪目标。

make帮助我们解决了gcc的调用问题,但是它仍然存在如下两个问题:

  1. Makefile的编写比较繁琐
  2. Makefile在跨平台时需要重新编写

为了解决上面的两个问题,cmake的出现了。

4、CMAKE

CMAKE是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。是由美国国家医学图书馆出资开发的开源软件,遵循BSD许可。 cmake会根据Cmakelist.txt文件生成Makefile文件,之后我们就可以调用make来编译整个项目。而且Cmakelist.txt的编写相对比较简单。

这里你可能会问为什么GNU组织没有开发相应的开源软件来解决make的上述两个问题?回答是GNU组织也开发相应的软件叫autotools,其实是一个工具集包括autoscan、autoconf等一系列的工具,由于工具太多,步骤和配置繁琐,后期被cmake替代了,在github上有一些相对老的软件依然是使用autotools来实现编译的。一般软件开发者会通过autoconf来生成configure,而我们在使用的时候,只需要执行./configure就可以生成相应的Makefile文件,再make就可以了。


提示

欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者


Released under the MIT License.