继续前面的一篇文章
objects = main.o add.o sub.o test:$(objects) gcc -o test $(objects) main.o:main.c gcc -c main.c add.o:add.c add.h gcc -c add.c sub.o:sub.c sub.h gcc -c sub.c .PHONY:clean clean: rm test $(objects)
其中objects是makefile中的变量,如果我们这里不用变量,那么这个makefile文件会写成什么样?
test:main.o add.o sub.o gcc -o test main.o add.o sub.o main.o:main.c gcc -c main.c add.o:add.c add.h gcc -c add.c sub.o:sub.h sub.c gcc -c sub.c .PHONY:clean clean: rm test $(objects)
不使用变量的时候,main.o add.o sub.o会被写多次,如果添加或者删除一个目标文件的时候,就需要在两个地方修改了。
在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。
比如,我们声明一个变量,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管什么啦,只要能够表示obj文件就行了。我们在makefile一开始就这样定义:
objects = main.o add.o sub.o
于是,我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了。如果一行写不下,可以像C语言那样,添加一个换行连字符。
比如 objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
让make自动推导
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。
并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile写成如下:
objects = main.o add.o sub.o test:$(objects) gcc -o test $(objects) add.o:add.h sub.o:sub.h .PHONY:clean clean: rm test $(objects)
现在问题又来了,如果工程中有很多的.h文件,每一个目标文件需要对应多个.h文件,这样的话,就会有多行的.h文件的依赖关系,能不能把它们收拢起来,统一写在一个地方呢?