今天回顾了一下makefile,做下笔记;
首先准备几个简单的文件
add.c head.h main.c mul.c sub.c
然后第一版 makefile
app:sub.c add.c mul.c main.c
gcc main.c sub.c add.c mul.c -o app
然后第二版:
app:add.o sub.o main.o mul.o
gcc sub.o add.o mul.o main.o -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mul.o:mul.c
gcc -c mul.c -o mul.o
main.o:main.c
gcc -c main.c -o main.o
然后第三版:
makefile 的语法跟shell 很像
src = add.c main.c mul.c sub.c
obj = add.o sub.o mul.o main.o
app:$(obj)
gcc $(obj) -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mul.o:mul.c
gcc -c mul.c -o mul.o
main.o:main.c
gcc -c main.c -o main.o
clean:
rm -rf $(obj) app
第四版:
目标:依赖
(tab)条件
$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项
src = add.c main.c mul.c sub.c
obj = add.o sub.o mul.o main.o
ALL:app
app:$(obj)
gcc $^ -o $@
sub.o:sub.c
gcc -c $< -o $@
add.o:add.c
gcc -c $< -o $@
mul.o:mul.c
gcc -c $< -o $@
main.o:main.c
gcc -c $< -o $@
clean:
rm -rf $(obj) app
第五版:
src = $(wildcard *.c) 找到当前目录下所有后缀为.c的文件,赋值给src
obj = $(patsubst %.c,%.o, $(src)) 把src变量里所有后缀为.c的文件替换成.o
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
app:$(obj)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
clean:
rm -rf $(obj) app
.PHONY: clean