1.格式:
目标:依赖
规则 规则前有一个tab键 ,缺少tab键出错,使用空格替代也不可以
(1). 例子: 编写makefile 编译 main.c ,fun.c , fun.h
test:main.o fun.o gcc main.o fun.o -o test fun.o:fun.c gcc -c fun.c -o fun.o main.o:main.c gcc -c main.c -o main.o .PHONY #此行是防止,当前编译的目录下存在clean文件,不然报错 clean: rm *.o test
(2). 使用变量
# 使用变量代替比较长的编译工具名 CC=gcc #使用变量代替较多的参数 CFLAGS=-c -Wall test:main.o fun.o &(CC) main.o fun.o -o test main.o:main.c $(CC) $(CFLAGS) main.c -o main.o # gcc -c main.c -o main.o -Wall #不使用变量情况,使用变量时 用 $ 符取变量值 fun.o:fun.c &(CC) $(CFLAGS) fun.c -o fun.o .PNOHY clean: rm *.o test
(3). 自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并且以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格隔开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格隔开
CC=gcc CFLAGS=-c -Wall test:main.o fun.o $(CC) $^ -o $@ # $^ 所有不重复的依赖文件,以空格隔开 main.o:main.c $(CC) $(CFLAGS) $< -o $@ # $< 第一个依赖文件的名称,$@ 目标文件的完整名称 fun.o:fun.c $(CC) $(CFLAGS) fun.c -o fun.o .PHONY clean: rm *.o test
(4). 隐含规则
CC=gcc CFLAGS=-c -Wall # 隐含规则,注意目标文件必须是一个已存在的文件,下一行的规则没有,但需要tab键 main:mian.o fun.o # 此处目标不能再写test了,必须是已存在的文件名 .PHONY clean: rm *.o main