Makefile规则
书写规则:
目标文件 : 依赖文件
(一个tab键)命令
==注:==tab键不能用空格替代
目标文件 | 最终要生成的文件 |
---|---|
依赖文件 | 为了生成目标文件所需要的文件 |
命令 | 通过依赖文件生成目标文件的方法 |
运行:执行***make***命令,执行命令的时候可以加上‘-n’,代表命令不执行,只是预览要执行的命令
伪目标 (空的)
(一个tab键)命令
常用:
clean:清除相关文件,命令的前加‘-’,可以在文件删除不成功时继续执行后面的命令
all/ALL:最终要生成的最终目标,不要写命令
运行: 执行 ***make 伪目标***命令
执行规则:
1、如果目标文件的时间早于依赖文件则会重新生成目标文件
2、如果依赖文件不存在则会去找相应的规则去生成依赖文件
=注意= 伪目标最好写在.phony的后面,避免当前目录下有重名文件,导致不执行伪目标
函数
makefile中变量不需要类型,例如:src=abc
取变量的值用$(变量) ====> $(src) ====> abc
Wildcard $(wildcard *.c) 匹配当前目录下所有.c文件
patsubst
(
p
a
t
s
u
b
s
t
(patsubst %c,%o,
(patsubst(src))
Src = $(wildcard *.c)
Obj =
(
p
a
t
s
u
b
s
t
(patsubst %c,%o,
(patsubst(src))
自动变量
$(@) 代表规则中的目标文件
$(^) 代表规则中的所有依赖文件
$(<) 代表规则中的第一个依赖文件
模式匹配
%.o : %.c
$(obj) : %.o : %.c (表示只会对obj变量中的.o文件有效)
工程文件管理
bin | 存放可执行文件 |
---|---|
src | 存放源文件 |
include | 存放头文件 |
obj | 存放汇编后的二进制文件(目标文件) |
lib | 存放库文件 |
简单的一个makefile模板
src = $(wildcard ./src/*.c)
obj = $(patsubst ./src/%.c, ./obj/%.o, $(src))
target=./bin/a.out
all:$(target)
$(target):$(obj)
gcc $(^) -o $(@)
$(obj):./obj/%.o:./src/%.c
gcc -c $(^) -I ./include -o $(@)
.PHONY:clean all
clean:
-rm -rf $(target) $(obj)