Makefile的简单例子:
CC=gcc #定义成变量,方便不同环境的修改。
CFLAGS=-Wall -g -std=c99 #定义成变量,方便不同环境的修改。
LDFLAGS= -lm
RM=rm -f
circle: clrcle.o clircularaea.o #目标circle,前提circle.o, clircularaea.o
$(CC) $(LDFLAGS) -o -$@ $^ #转换成shell命令是: gcc -lm -o circle clrcle.o clircularaea.o
circle.o: circle.c #目标circle.o,前提circle.c
$(CC) $(CFLAGS) -o $@ -c $< #转换成shell命令是: gcc -Wall -g -std=c99 -o circle.o -c clrcle.c
circulararea.o:circulararea.c
$(CC) $(CFLAGS) -o -$@ -c $< #转换成shell命令是: gcc -Wall -g -std=c99 -o circulararea.o -c o:circulararea.c
.PHONY: clean #伪目标:目标并未产生的文件名。
clean:
$(RM) circle circle.o circle.o #删除生成的文件,没有产生名为clean的目标。
第一个目标必须放在这行的开始,左边没有空白符。而且每个命令都必须以制表符字符开始。
当makefile引用一个规则以建立目标时,此规则中每一行命令都分别以独立的shell实例被分别执行。
自动变量
$@ 目标名称
$* 目标文件名的stem,也就是模式规则中%所代表的部分
$< 第一个前提
$^ 前提的列表,排除重复的元素
$? 比目标新的前提列表
$+ 前提的完整列表,包含重复着
$% 如果目标是链接库的一个成员,变量$%会产生成员名称,不带有链接库的文件名。而$@提供链接库的文件名。