GCC、MAKE和CMAKE
软件版本 | 硬件版本 | 更新内容 |
---|---|---|
首次编写 |
1、GCC、MAKE和CMAKE的关系
说明:
- cmake会根据Cmakelist.txt生成makefile文件
- make会解析Makefile从而生成一条条的gcc编译指令
- make调用gcc生成目标文件
整个编译任务由三者共同协作来完成,下面具体介绍一下这三个工具,从而说明为什么需要三个工具才能完成整个编译任务。
2、GCC
GCC是众多GNU自由软件中的一个,是一支持C/C++、Object-c、Go等很多的编程语言的编译器。GCC本质上一个编译套件,包括编译过程中各个功能模块,如ar、ld等等。也就是GCC是包括编译前端和后端的编译套件。
当我们的项目很小,只有一个或者几个文件时,直接可以通过GCC来完成编译工作:
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的调用问题,但是它仍然存在如下两个问题:
- Makefile的编写比较繁琐
- 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就可以了。
提示
欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者