一个 Makefile 文件中可以有一个或者多个规则
目标 ...: 依赖 ...
命令(Shell 命令)
...
⚫ 目标:最终要生成的文件(伪目标除外)
⚫ 依赖:生成目标所需要的文件或是目标
⚫ 命令:通过执行命令对依赖操作生成目标(命令前必须 Tab 缩进)
app: sub.c add.c mult.c div.c main.c
gcc sub.c add.c mult.c div.c main.c -o app
命令在执行之前,需要先检查规则中的依赖是否存在
如果存在,执行命令
如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,
如果找到了,则执行该规则中的命令
app:sub.o add.o mult.o div.o main.o
gcc sub.o add.o mult.o div.o main.o -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mult.o:mult.c
gcc -c mult.c -o mult.o
div.o:div.c
gcc -c div.c -o div.o
main.o:main.c
gcc -c main.c -o main.o
检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
如果依赖的时间比 目标的时间晚,需要重新生成目标
如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被
执行
如果不更改文件, make 输出
make: “app”已是最新。
更改了 main.c 文件,则输出
gcc -c main.c -o main.o
gcc sub.o add.o mult.o div.o main.o -o app
◼ 自定义变量
变量名 = 变量值
var=hello
◼ 预定义变量
AR : 归档维护程序的名称,默认值为 ar
CC : C 编译器的名称,默认值为 cc
CXX : C++ 编译器的名称,默认值为 g++
$@ : 目标的完整名称
$< : 第一个依赖文件的名称
$^ : 所有的依赖文件
◼ 获取变量的值
$( 变量名 )
app:main.c a.c b.c
gcc -c main.c a.c b.c
# 自动变量只能在规则的命令中使用
app:main.c a.c b.c
$(CC) -c $^ -o $@
$(var)
add.o:add.c
gcc -c add.c
div.o:div.c
%.o:%.c
gcc -c div.c
- %: 通配符,匹配一个字符串
sub.o:sub.c
- 两个 % 匹配的是同一个字符串
gcc -c sub.c
%.o:%.c
mult.o:mult.c
gcc -c $< -o $@
gcc -c mult.c
main.o:main.c
gcc -c main.c
$(wildcard PATTERN...)
功能:获取指定目录下指定类型的文件列表
参数: PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多
个目录,一般使用空格间隔
返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
示例:
$(wildcard *.c ./sub/*.c)
返回值格式 : a.c b.c c.c d.c e.c f.c $(patsubst <pattern>,<replacement>,<text>)
功能:查找 <text> 中的单词 ( 单词以“空格”、“ Tab ”或“回车”“换行”分隔 ) 是否符合
模式 <pattern> ,如果匹配的话,则以 <replacement> 替换。
<pattern> 可以包括通配符 `%` ,表示任意长度的字串。如果 <replacement>
中也包含 `%` ,那么, <replacement> 中的这个 `%` 将是 <pattern> 中的那个 %
所代表的字串。 ( 可以用 `\` 来转义,以 `\%` 来表示真实含义的 `%` 字符 )
返回:函数返回被替换过后的字符串
示例:
$(patsubst %.c, %.o, x.c bar.c)
返回值格式 : x.o bar.o
src=sub.o add.o mult.o div.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
找依赖,找 sub.o 如果没有找到,则找到第二条 %.o:%.c 通用模式匹配,编译出 sub.o
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
默认执行第一个规则 ,如果想 执行其他需要指定 make clean
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
clean:rm $(objs) -f
定义为伪目标,就不会生成特定的文件
.PHONY:clean
clean:
rm $(objs) -f