目标:依赖
(tab)指令
第一行必须为最终目标, 生成对象文件.o是为了避免重复编译未修改的.c文件.
makefile中的自动变量只能在规则中的命令使用
$<: 规则中第一个依赖
$@: 规则中的目标
$^: 规则中的所有依赖
app:main.o sub.o mul.o
gcc $^ -o $@ #(即gcc main.o sub.o mul.o -o app)
%.o:%.c
gcc -c $< -o $@
也可以使用自带函数和自定义变量
src=$(wildcard ./*.c) #用来查找文件, 返回字符串, 加$()成为变量
obj=$(patsubst ./%.c, ./%.o, $(src)) #字符串替换, 把$(src)中的.c都替换成.o
# 以上两句等价于obj=main.o sub.o mul.o
target=app
$(target):$(obj)
gcc $(obj) -o $(target)
%.o:%.c
gcc -c $< -o $@
# 删除所有.o和app, 通过make clean执行clean伪目标, 伪目标不会生成文件因此不会和当前目录下存在的同名clean文件比较新旧导致无法执行命令, 只是一个安全措施.
.PHONY:clean
clean:
-mkdir /aa #无权限无法创建, 命令前加-表示出错后忽略, 继续执行后面的命令
rm -f $(obj) $(target)
makefile维护的内部变量
CPPFLAGS: 预处理器需要的选项 如: -I (预处理包括头文件展开, 宏替换, 取消注释)
CFLAGS: 编译的时候使用的参数 -Wall -g -c
LDFLAGS: 链接库使用的选项 -L -l
网友评论