一、Makefile规则格式
目标.....: 依赖文件集合.......
命令1
命令2
.....
main : main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
这条规则的目标是 main,main.o、 input.o和 calcu.o是生成 main的依赖文件,如果要更新
目标 main,就必须先更新它的所有依赖文件,如果依赖文件中的任 何一个有更新,那么目标也
必须更新,“更新”就是执行一遍规则中的命令列表。
Makefile第一条规则的目标成为默认目标,只要默认目标更新了那么就认为 Makefile的工作。
二、 Makefile变量
main : main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
上述 Makefile语句中, main.o input.o和 calcue.o这三个依赖文件,输入了两遍,如果Makefile复杂的时候这种重复输入的工作就会非常费时间,而且非常容易输错,为了解决这个问题, Makefile加入了变量支持。下面是使用Makefile变量修改后的文件:
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
Makefile变量只有只有一种就是字符串类型。
2.1、赋值符“=”
使用“ “=”在给变量的赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值
比如如下代码:
name = jack
curname = $(name)
name = hijack
print:
echo curname: $(curname)
echo:相当于c语言中的printf语句(语句前加上@就不显示语句运行过程如:@echo curname:$(curname))
运行结果如下:
通过查看结果可知curname最后的赋值为name的最后一次赋值,所以使用“=”借助另外一个变量,可以将变量的真实值推到后面去定义。也就是变量的真实值取决于它所引用的变量的最后一次有效值。
2.2、赋值符“:=”
使用:=赋值便可以达到向c语言赋值一样如下图所示:
name = jack
curname := $(name)
name = hijack
print:
echo curname: $(curname)
运行上面的代码得到一下结果:
2.3、赋值符“?=”
curname ?= jack
这条语句表示如果curname前面已经被赋值了就继续使用前面的值这条赋值语句相当于空,如果前面没有被赋值那么curname的值就赋为jack。
2.4、赋值符“+=”
curname += main.o
这条语句的意思为若curname原来的值为add.o input.o运行晚上一句之后则curname的值就变成为add.o input.o main.o。
三、Makefile模式规则
,“%”表示长度任意的非空字符串,比如 “%.c”就是所有的以 .c结尾的文件,类似与通配符。当“ “%”出现在目标中的时候,目标中 “%”所代表的值决定了依赖中的 “%”值。
object=main.o calcu.o input.o
main:object
gecc -o main $(object)
%.o:%.c
#命令
clean:
rm *.o
rm main
四、Makefile自动化变量
自动化变量就是完成这个功能的!所谓自动化变量就是这种变量会把模式中所
定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该
出现在规则的命令中。
五、Makefile伪目标
Makefile有一种特殊的目标 伪目标,一般的目标名都是要生成的文件,而伪目标不代
表真正的目标名,在执行 make命令的时候通过指定这个伪目标来执行其所在规则的定义的命
令。
.PHONY:clean #伪目标