我们在了解了Makefile的基础原理后,为了使用更加方便,如果把全部的 .o 文件全部写下来将会很麻烦,于是我们可以利用变量代替相关的 .o 文件,于是Makefile有了提高部分:
1、利用 OBJS 替代 全部 .o 文件:
我们可以理解为 OBJS → objs → objects
于是我们将原有的Makefile
edit: main.o kbd.o command.o display.o insert.o search.o files.o utils.o
gcc main.o kbd.o command.o display.o insert.o search.o files.o utils.o -o edit
main.o: main.c defs.h
gcc -c main.c -o main.o
kbd.o: kbd.c defs.h command.h
gcc -c kbd.c -o kbd.o
command.o: command.c defs.h command.h
gcc -c command.c -o command.o
display.o: display.c defs.h buffer.h
gcc -c display.c -o display.o
insert.o: insert.c defs.h buffer.h
gcc -c insert.c -o insert.o
search.o: search.c defs.h buffer.h
gcc -c search.c -o search.o
files.o: files.c defs.h buffer.h command.h
gcc -c files.c -o files.o
utils.o: utils.c defs.h
gcc -c utils.c -o utils.o
.PHONY: clean
clean:
rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
写成如下形式:
edit: main.o kbd.o command.o display.o insert.o search.o files.o utils.o
gcc main.o kbd.o command.o display.o insert.o search.o files.o utils.o -o edit
main.o: main.c defs.h
gcc -c main.c -o main.o
kbd.o: kbd.c defs.h command.h
gcc -c kbd.c -o kbd.o
command.o: command.c defs.h command.h
gcc -c command.c -o command.o
display.o: display.c defs.h buffer.h
gcc -c display.c -o display.o
insert.o: insert.c defs.h buffer.h
gcc -c insert.c -o insert.o
search.o: search.c defs.h buffer.h
gcc -c search.c -o search.o
files.o: files.c defs.h buffer.h command.h
gcc -c files.c -o files.o
utils.o: utils.c defs.h
gcc -c utils.c -o utils.o
.PHONY: clean
clean:
rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
感觉是不是比之前的简单了一些?不过接下来还有更加劲爆的改变
2、省略 .c 文件
现在的GNU的make很强大,他会自动推导文件以及文件依赖关系后面的命令,即我想生成一个 .o 文件,make就会在依赖文件中自动加一个 .c 文件,同时后面的命令 gcc -c *.c -o *.o 也会自动推导出来,于是程序就可以编程如下:
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit: $(objects)
gcc $(objects) -o edit
main.o: defs.h
kbd.o: defs.h command.h
command.o: defs.h command.h
display.o: defs.h buffer.h
insert.o: defs.h buffer.h
search.o: defs.h buffer.h
files.o: defs.h buffer.h command.h
utils.o: defs.h
.PHONY: clean
clean:
rm edit $(objects)
现在有什么感觉了?但是还不够。
3、减少.h文件
目前已经很简洁了,可是还是有那么多的 .h 文件,该如何处置呢?这时我们可以把需要相同 .h 依赖文件的目标文件写在一起,于是,就出现下面的样子:
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit : $(objects)
gcc $(objects) -o edit
$(objects) : defs.h
kbd.o command.o files.o: command.h
display.o insert.o search.o files.o: buffer.h
.PHONY: clean
clean:
rm edit $(objects)
4、关于clean
每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”。一般的风格都是:
clean:
rm edit $(objects)
更为稳健的做法是(具体原因基础篇有介绍),其中 rm 前的 - 表示如果某些文件出现问题,但不要管,继续做后面的事:
.PHONY : clean
clean :
-rm edit $(objects)
本文内容主要引用
陈皓《跟我一起写makefile》
,想更好的了解Makefile,推荐大家去阅读
陈皓《跟我一起写makefile》。