makefile的好处就是制定好规则就可以快速的编译一个项目,当我仅仅修改了一份源代码的时候,Makefile可以通过时间戳判断哪些文件需要重新编译
例如有以下几个文件:
main.c
a.h
a.c
b.h
b.c
规则
目标:依赖
命令
命令之前需要有一个【tab】制表符. 依赖太长的时候需要用反斜杠【\】换行
依赖文件必须写全,当依赖被修改的时候,目标才会重新构建
main: main.o a.o b.o
gcc -o main main.o a.o b.o
main.o:main.c a.h b.h
gcc -c main.c
a.o: a.c a.h
gcc -c a.c
b.o: b.c b.h
gcc -c b.c
定义变量
定义一个变量,使用$(变量名)调用
例如
object = main.o a.o b.o
main:$(object)
gcc -o main $(object)
clean规则
可以使用clean清除编译中生成的object文件,例如
clean:
rm -fv $(object)
使用make clean
执行
.PHONY规则 & all规则
.PHONY两个用途:
- 防止某个规则和同名文件冲突
- 如果某个规则并不产生目标文件,则make不会执行,把这个规则指定为.PHONY即可
all规则的用途:希望生成多个目标的时候用这个
举例:
object = main.o a.o b.o
all:main clean
main:main.c
gcc main.c -o main
.PHONY:clean
clean:
rm -fv $(object)
自动推导
在目标文件是.o文件的时候,依赖文件可不用写.c 并且会自动推导出相关的编译命令,例如:
main.o:main.c a.h b.h
gcc -c main.c
a.o: a.c a.h
gcc -c a.c
b.o: b.c b.h
gcc -c b.c
可以简写成
main.o: a.h b.h
a.o: a.h
b.o: b.h
特殊变量
- $@ 目标文件
- $^ 所有的依赖文件
- $< 第一个依赖文件
最终效果:
object = main.o a.o b.o
main: $(object)
gcc -o $@ $^
main.o: a.h b.h
a.o: a.h
b.o: b.h
clean:
rm -fv $(object)