Makefile
会不会写makefile,从一个侧面决定一个人是否具备完成大型工程的能力。
Makefile和make命令一起配合使用,为什么要使用makefile,原因以及优点在下文解释。
简单辨析一下建立工程的三种方式
-
Makefile
使用非常广泛,通用性强,可跨平台
但是语法比较严格,写一个通用,便于管理,兼容性强的makefile比较困难
-
cmake
简单易用,使用广泛,便于管理,可跨平台
自动生成的makefile过于臃肿
-
sh脚本
自由,高度定制,简单易用,可操作性强,方便维护。
sh建立的工程太少
makefile带来的好处就是“自动化编译”
-
把源文件编译成中间代码文件 ,在windows下就是.obj文件,在UNIX下是.o文件。这个动作叫做编译(compile)
-
再把目标文件合成为可执行文件的过程或者称为动作叫做链接
源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。
如果函数未被声明,编译器会给出一个警告,但可以生成 ObjectFile.而在链接程序时,链接器会在所有的ObjectFile中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。
Makefile告诉make命令如何编译和链接工程中需要的源文件和头文件。
Makefile文件包含了一系列的“规则”,规则的基本结构如下: 目标、依赖、命令
编译规则如下:
1)如果这个工程没有编译过,则需要所有的C文件都要编译并链接
2)如果工程中的某几个C文件被修改,那么我们只编译被修改后的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,需要编译引用这几个头文件的C文件,并链接目标程序。
make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重新编译,从而自己编译所需要的文件和链接目标程序。
目标文件(Target)包含:执行文件 和 中间目标文件
依赖文件就是冒号之后的.c文件和.h文件。每一个.o文件都有一组依赖文件,而.o文件又是执行文件的依赖文件。
依赖文件的实质就是说明 目标文件由哪些文件生成。换言之,就是目标文件是哪些文件更新的。
定义好依赖文件之后的命令定义了如何生成目标文件的操作系统命令。
make会比较依赖文件和目标文件的修改日期,如果依赖文件的修改日期比目标文件的修改日期新或者目标文件不存在时,执行make后续定义的命令。
在Makefile中使用变量
使用变量来简化规则的编写。变量可以在Makefile的任何地方,引用变量时需要使用$(变量名)的形式。
赋值:=和:=
·使用=进行赋值时,Makefile会延迟展开,这意味着变量的值不会立即确定