首先让我们来看一个例子
edit: main.o kbd.o command.o
gcc -o edit main.o kbd.o command.o
在这里我们发现所有的.o
文件都被使用了两次,如果我们的工程需要加入新的.o
文件,那么我们需要添加两次(其实是三次,因为我们一般会在末尾加上clean)。为了Makefile的易维护性,我们在Makefile中使用变量,变量也就是一个字符串。那么我们可以作如下的修改
objects = main.o kdb.o command.o
edit:$(objects)
gcc -o edit $(objects)
main.o:main.c defs.h buffer.h
gcc -c main.c
kdb.o:kbd.c buffer.h
gcc -c kbd.c
command.o:command.c defs.h
gcc -c command.c
clean:
rm edit $(objects)
当我们有新的.o
文件加入时,只需要修改objects对象即可
————————————————————————————————————
make的自动推导
GNU的make很强大,它可以自动推导文件以及文件的依赖关系后面的命令,所以我们没有必要在每一个.o
文件后都写上相似的命令,因为make会自动识别,并且自动推导
只要make看到一个.o
文件,它就会自动把.c
文件加到依赖关系中,例如我们需要main.o
那么就会找到main.c
文件,并且gcc -c main.c
也会被推导出来,所以我们就没有必要写的这么复杂,上面的例子我们可以写成这样子
objects = main.o kdb.o command.o
edit:$(objects)
gcc -o edit $(objects)
main.o: defs.h buffer.h
kbd.o: defs.h
command.o: buffer.h
.PHONY:clean
clean:
rm edit $(objects)
这里是make的隐晦规则,其中.PHONY
表示clean
是一个伪目标文件