简单规则介绍
1
%.o/%.c : %是通配符
$@ : 表示生成的目标文件
$< : 表示第一个依赖文件
$^ : 表示所有依赖文件
2
Make后面若无目标,默认执行第一个目标
.PHONY 伪目标,假想目标
3
即时变量、延时变量
简单变量(是即时变量):
A:=xxx #A的值立即就可以确定,即在定义的时候就已经确定了
B =xxx #B的值在使用到的时候才确定
比如:
这个例子可能不太明显,我们接下来在举几个更加贴切的例子,
echo是输出命令,echo命令前面的@符号是不让echo这条回显打印输出在终端,而仅仅输出变量A和B的值。
好继续举例子:
上面这个例子就比较明显了,我们定义了一个C变量,然后分别赋值给A和B,但是呢,C变量的定义在A和B之后,因此在打印A和B的值的时候,A是即时变量输出的是空,B是延时变量只有在使用的时候才确定值,因此输出的是abc。
我们把C的值在往后面放放看看
看,也就是说延时变量在确定值得时候和变量得位置无关。
这里子说明延时变量虽然和位置无关,但是使用得值是最后一次得定义。
就是说在变量C前面添加一个加号,就是变量前面一定定义的在拼接上接下来定义的。
下面来说明一下:
:= #即时变量
= #延时变量
?= #延时变量,如果在执行该句时是第一次定义才起效,如果在该句前面该变量已定义则忽略这句
+= #附加,它是即时变量还是延时变量取决于起那面的定义
还可以通过命令行进行修改,这样makefile文件里面定义的变量就不起作用了
函数
$(foreach var ,list,text)
$(filter pattern…,text) #在text中取出符合patten格式的值
$(fileter-out pattern…,text) #在text中取出不符合patten格式的值
$(wildcard pattern) #pattern定义了文件名的格式
#wildcard取出其中存在的文件
(var)) #从列表中取出每一个值
#如果符合pattern
#则替换为replacement
编译选项
-M 命令是查看c.c文件的所有依赖。
那怎么把c.c的所有依赖全部写道一个文件里面呢
Gcc -M -MF c.d c.c
然后cat一下这个文件
gcc -c -o c.o c.c -MD -MF c.d
编译c.o,把依赖写入到c.d
CFLAGS:编译参数
Makefile 实例