今天翻了下qt的qmake manual,就心血来潮地搜了些make的博客看看。
着重Makefile经典教程(掌握这些足够)
和LIB和DLL的区别与使用这两篇博客,感觉写得很棒,将今天的收获归纳如下。
make
Qt的qmake会根据.pro文件自动生成Makefile。Makefile中定义了一系列规则,规定哪些文件需要先编译,哪些文件后编译,哪些文件需要重新编译,实现了自动编译的功能。
若是有了Makefile,那么就可以简单地使用
make makeDemo
命令,完成编译得到可执行文件的过程。当然也可以执行
make clean
清除,然后重新编译。
make过程
1.make首先会寻找Makefile。
2.在Makefile中寻找TARGET,并把这个TARGET作为最终的目标文件。
3.寻找TARGET的依赖项.o文件,再去找.o文件的依赖项....
4.相当于到了叶子节点,就找到.c和.h文件编译生成.o文件,...,最后生成可执行文件。
链接库
首先我们要清楚编译是将源代码编译成中间代码.o文件,再通过链接器将链接库中需要的代码与.o文件链接在一起,生成可执行文件。根据可执行文件中包含实际代码还是只是包含函数代码的入口地址,分为静态编译和动态编译两种。同样也有静态链接库和动态链接库两种。
静态链接库
LIB中包含了函数代码本身,在链接时直接将代码加入到可执行文件中,称为静态链接库。
动态链接库
LIB中包含了函数所在DLL文件和文件中函数位置的信息,代码有运行时加载在进程空间中的DLL提供,称为动态链接库。
静态链接
静态链接使用静态链接库,连接器从静态链接库中找到应用的函数代码,并将库同代码一起放入到可执行文件中。
动态链接
动态链接使用动态链接库,允许可执行文件只包含在运行时定位动态链接库DLL中所需函数的位置信息。
总结
将make过程和链接库结合在一起看:要是.c,.h被修改过那它的修改时间一定会比生成的可执行文件的时间要新,那么相关的依赖这些.c,.h文件的.o文件就需要重新编译,然后回溯到TARGET,最后根据动态编译还是静态编译,以不同的方式产生可执行文件。