1. 第一层:显式规则
# 井号是注释
# 目标文件: 依赖文件
# <tab> 指令
#
# 第一个目标文件是最终目标!
#
# 伪目标:.PHONY:
hello: hello.o
gcc hello.o -o hello
hello.o: hello.S
gcc -c hello.S -o hello.o
hello.S: hello.i
gcc -S hello.i -o hello.S
hello.i: hello.c
gcc -E hello.c -o hello.i
.PHONY:
cleanall:
rm -rf hello.o hello.S hello.i hello
clean:
rm -rf hello.o hello.S hello.i
现有文件:circle.c circle.h cube.c cube.h main.c main.h
得到可执行文件 test,省去预编译、汇编:
test: circle.o cube.o main.o
gcc circle.o cube.o main.o -o test
circle.o: circle.c
gcc -c circle.c -o circle.o
cube.o: cube.c
gcc -c cube.c -o cube.o
main.o: main.c
gcc -c main.c -o main.o
.PHONY:
cleanall:
rm -rf circle.o cube.o main.o test
clean:
rm -rf circle.o cube.o main.o
2. 第二层:变量
# =(替换) +=(追加) :=(恒等于)
# 使用变量:$(变量名)
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
$(TAR): $(OBJ)
$(CC) $(OBJ) -o $(TAR)
circle.o: circle.c
$(CC) -c circle.c -o circle.o
cube.o: cube.c
$(CC) -c cube.c -o cube.o
main.o: main.c
$(CC) -c main.c -o main.o
.PHONY:
cleanall:
rm -rf $(OBJ) $(TAR)
clean:
rm -rf $(OBJ)
3. 第三层:隐含规则
# %.c %.o 任意的.c/.o *.c *.o 所有的.c/.o
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
$(TAR): $(OBJ)
$(CC) $(OBJ) -o $(TAR)
%.o: %.c
$(CC) -c %.c -o %.o
.PHONY:
cleanall:
rm -rf $(OBJ) $(TAR)
clean:
rm -rf $(OBJ)
4. 第四层:通配符
# $@ 所有的目标文件 $^ 所有的依赖文件 $< 所有的依赖文件的第一项
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
$(TAR): $(OBJ)
$(CC) $^ -o $@
%.o: %.c
$(CC) -c $^ -o $@
.PHONY:
cleanall:
rm -rf $(OBJ) $(TAR)
clean:
rm -rf $(OBJ)