简单规则介绍

1

%.o/%.c : %是通配符

$@ : 表示生成的目标文件

$< : 表示第一个依赖文件

$^ : 表示所有依赖文件

makefile 中加echo_文件名

2

Make后面若无目标,默认执行第一个目标
.PHONY 伪目标,假想目标

3

即时变量、延时变量

简单变量(是即时变量):

A:=xxx #A的值立即就可以确定,即在定义的时候就已经确定了

B =xxx #B的值在使用到的时候才确定

比如:

makefile 中加echo_makefile 中加echo_02


makefile 中加echo_makefile 中加echo_03


这个例子可能不太明显,我们接下来在举几个更加贴切的例子,

echo是输出命令,echo命令前面的@符号是不让echo这条回显打印输出在终端,而仅仅输出变量A和B的值。

好继续举例子:

makefile 中加echo_赋值_04


makefile 中加echo_bc_05


makefile 中加echo_赋值_06


makefile 中加echo_makefile 中加echo_07


上面这个例子就比较明显了,我们定义了一个C变量,然后分别赋值给A和B,但是呢,C变量的定义在A和B之后,因此在打印A和B的值的时候,A是即时变量输出的是空,B是延时变量只有在使用的时候才确定值,因此输出的是abc。

我们把C的值在往后面放放看看

makefile 中加echo_makefile 中加echo_08


makefile 中加echo_bc_09


看,也就是说延时变量在确定值得时候和变量得位置无关。

makefile 中加echo_bc_10


makefile 中加echo_文件名_11


这里子说明延时变量虽然和位置无关,但是使用得值是最后一次得定义。

makefile 中加echo_bc_12


makefile 中加echo_bc_13


就是说在变量C前面添加一个加号,就是变量前面一定定义的在拼接上接下来定义的。

下面来说明一下:

:= #即时变量

= #延时变量

?= #延时变量,如果在执行该句时是第一次定义才起效,如果在该句前面该变量已定义则忽略这句

+= #附加,它是即时变量还是延时变量取决于起那面的定义

makefile 中加echo_赋值_14


makefile 中加echo_makefile 中加echo_15


makefile 中加echo_makefile 中加echo_16


makefile 中加echo_赋值_17


makefile 中加echo_makefile 中加echo_18


还可以通过命令行进行修改,这样makefile文件里面定义的变量就不起作用了

函数

$(foreach var ,list,text)

makefile 中加echo_文件名_19


makefile 中加echo_bc_20

$(filter pattern…,text) #在text中取出符合patten格式的值

$(fileter-out pattern…,text) #在text中取出不符合patten格式的值

makefile 中加echo_赋值_21


makefile 中加echo_文件名_22

$(wildcard pattern) #pattern定义了文件名的格式
#wildcard取出其中存在的文件

makefile 中加echo_赋值_23


makefile 中加echo_文件名_24

makefile 中加echo_赋值_25(var)) #从列表中取出每一个值
#如果符合pattern
#则替换为replacement

makefile 中加echo_makefile 中加echo_26

makefile 中加echo_bc_27

编译选项

-M 命令是查看c.c文件的所有依赖。

makefile 中加echo_bc_28


那怎么把c.c的所有依赖全部写道一个文件里面呢

Gcc -M -MF c.d c.c

makefile 中加echo_bc_29


然后cat一下这个文件

makefile 中加echo_makefile 中加echo_30

gcc -c -o c.o c.c -MD -MF c.d
编译c.o,把依赖写入到c.d
CFLAGS:编译参数

Makefile 实例

makefile 中加echo_bc_31