白话make、makefile、cmake、qmake一看就懂

1,494 阅读4分钟

GCC

GNU编译套装(英语:GNU Compiler Collection,缩写GCC),指一套编译语言编译器。GCC可以编译多种语言,包括常见的C、C++、Java、Go、Object-C、Fottran等。


编译

当你的程序只有一个源文件(如hello.c)时,可以直接gcc命令去编译。

# gcc(选项)(参数)
gcc hello.c -o hello

当你的程序包含很多源文件时,用gcc命令逐个编译时,容易混乱且工作量很大。


解决编译难题(makefile)

当程序包含很多源文件时,如果我们还按照往常方式编译,每次编译时我们都要重复敲入大量命令。怎么解决呢?一个直观的想法是: 为了节省功夫,我们可以把一大堆命令先准备好放进一个文件,每次执行时复制到命令行执行就行了。这样就只需要敲一次了。再偷懒一点,我们干脆写一个程序让程序读取该文件,然后执行文件内的gcc命令,我们要编译时只需要告诉程序文件的路径就行了,这样就舒服多了。显然这个程序的逻辑是专属于你那个文件的,它只能解析你的那个文件。如果我要编译其他工程则又要写一个属于这个工程的程序,如此说来这个程序的复用性很差。于是为了复用性,制定一个标准文件内容格式,即makefile,就像是语法一样,大家都这样写,于是再写一个程序来读makefile就完美了。这个程序叫make。到这里问题基本已经解决了,只要每个人都按照makefile文件的格式来编写这个文件,那么大家都可以使用make这个程序来读取文件并执行。

makefile怎么写?-----跟我一起写makefile


解决makefile生成难题

要说人阿,真是无法满足阿。makefile说来说去,还是得自己写嘛,对于简单的工程自己手写当然是没什么问题的。但是大工程手写要命阿,还容易错呢,并且换平台了你还要重新写。

怎么办?正是人的欲望推动着人的发展阿,人们又发明了一个工具CMakeCmake可以用于给工程生成makefile文件给make程序使用,省去了人工编写的麻烦。等等,还有一个问题,CMake如何生成makefile?这里CMake是通过CMakeList.txt文件来生成。CMakeList.txt哪来?oh,yes!没错,该你动手了。如果你用IDE,类似VS一般都会帮你弄好。


为了减少学习成本,可以直接使用makefile,但cmake可以跨平台,且更加简单,各有利弊把!


大功告成

到这里我们基本讲的差不多了,具体的细节大家可以自行google。hold on,hold on。qmake还没登场呢?你就说结束了?

没没没呢,我现在就讲。要说qmake,得先说说QT。

QT是个啥?

是一个跨平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。你的QQ就是用这玩意开发的。 Qt使用标准的C++和特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏。通过语言绑定,其他的编程语言也可以使用Qt。

简单的说QT就是C++的第三方库,使用这个库你可以很容易生成图形界面。QT对C++进行了扩展,你写一行代码,QT在背后帮你写了几百上千行,而这些多出来的代码就是靠QT专有的moc编译器和uic编译器来重新编译你的那一行代码。因此,你在进行程序编译(编译得到机器指令) 前需要调用mocuic编译器先对qt源文件进行预处理(毕竟qt扩展了C++,使得你可以使用简单的语法完成任务,但是这可能不是C++的真正语法,所以需要先处理变成一个真的C++源文件,即符合C++语法的源文件,个人理解,有待商榷)。

既然mocuic也是两个编译器,那么我们也可以通过调用命令对我们的qt源文件进行编译。跟上面一样,这里我们也利用makefile来编译,但是这里的makefile是qt专用的,上面的那种是不可用的。接着,为了解决makefile生成的问题,就有了qmake,即qmake其实用来生成QT专用的makefile的,接着通过读取qt专用的makefile来执行命令对qt源文件进行编译。qmake无中生有吗?不是的,qmake又是根据工程文件.pro来生成makefile的。

好了,至此终于大公告成,大部分内容参考知乎@辉常哥回答,简直由浅入深,但其中也包含自己的理解。希望对你有帮助,如果可以给我点个赞把,阿里阿多。