1. gcc
对于c语言,使用gcc编译的时候,其实它只会默认帮你链接一些基本的c语言标准库(例如libc.a或者libc.so),有很多的依赖库(例如非标准库、第三方库等)是需要我们手动链接的,就是在gcc命令后面加上要链接的库。
当你的程序只有一个源文件的时候,直接使用gcc命令编译就行,但是当你有很多个源文件怎么办?在gcc命令那逐个文件敲上去?100个源文件你也敲上去?不仅源文件多,各个文件可能还得依赖不同的库,这样命令会变得很长,显然这是不可行的办法。
2. makefile文件
在Makefile里面你可以设置你想要的编译规则,你想要编译哪些文件,哪些文件不需要编译等等都可以体现在Makefile中,而且支持多线程并发操作,可以减少编译的时间。
但是呢,makefile文件依赖于平台,简单描述下:win平台下使用微软自己的nmake工具以及cl编译器,假使我们在win下写好了makefile,想要将之移植到linux下(使用make与g++)又得重新再写一个makefile
3. make工具
还有另一个工具make,make是用来执行Makefile的,make可以说成一个音乐家,Makefile就是一篇乐谱,音乐家根据乐谱的内容奏乐,make就是根据Makefile中写的内容进行编译和链接,make更像是一个批处理的工具,可以批处理源文件,只要执行一条make命令,就可以实现自动编译。
当我们编译整个项目工程的时候,make只会编译我们修改过的文件,没有修改过的就不用重新编译,这样我们debug了一个小bug后重新编译就不用花费大量的编译时间。只要没有添加文件或者删除文件,Makefile的内容都是不需要修改的。所以使用make+Makefile极大的提高了我们的工作效率。
4. cmake
对于一些不是很大的工程,Makefile完全是可以我们手工写的,但是工程非常大的时候,手写Makefile也是一件麻烦的事,而且Makefile又不是万能的,换了一个别的平台,Makefile又得重写。
于是又有人想,我们是不是可以自动生成一个Makefile呢?只需要把所有源文件读入就行,所以后面又出现了另一个工具,可以跨平台项目管理的工具cmake,cmake就可以生成Makefile文件给make去执行,这样就不用跨平台了还得去修改。
cmake它仍然是目标、依赖之类的抽象的东西,在Linux下,它会生成linux下的Makefile,在windows下,假如使用visual
studio,它会生成visual studio使用的工程文件,它会为各种编译器定制工程文件,是不是抽象的同时还挺友好的。
5. CMakeList
这时候一个疑问又产生了,cmake是怎么生成Makefile的?
其实cmake又是根据一个叫CMakeLists.txt的文件生成Makefile的,就是make是用来执行Makefile的,cmake是用来执行CMakeLists.txt的。那CMakeLists.txt又是谁生成的?哈哈!CMakeLists.txt是自己手写的哦。