因为一直对些makefile比较头疼,直到最近要学习LDD的时候才决定要简单的看看MAKEFILE。不然真是没法学了。
一个简单的makefile组成可以如下:
target : request
cmdline
........
target: 规则的目标,通常是最后需要生成的文件名或者为了实现这个目的而必须的中间过程名字。也可以是伪目标 如clean。它是make要执行的一个动作。(Makefile 中把那些没有任何依赖只有执行动作的目标称为“伪目标”)
request:生成规则目标所需要的文件名列表。诸如.c ,.h的文件........
cmdline:在cmdline之前必须加上TAB,cmdline就是命令行。make执行的动作。
简单的makefile的例子:
edit: main.o result.o lost.o cool.o visual.o
[tab]cc -o edit main.o result.o lost.o cool.o visual.o
main.o:main.c main.h
[tab]cc -c main.c
result.o:result.c result.h
[tab]cc -c result.c
lost.o: lost.c defs.c cool.c lost.h
[tab]cc -c lost.c
cool.o: cool.c cool.h msfd.c msfd.h
[tab]cc -c cool.c
visual.o:visual.c visual.h cannon.c cannon.h
[tab]cc -c visual.c
clean:
[tab]rm edit main.o result.o lost.o cool.o visual.o
其中edit是最终需要生成的应用程序,编译edit时需要main.o result.o等依赖文件,而这些.o文件也依赖于其他.c.h的文件。在默认情况下
make执行的是Makefile中的第一个规则。此规则的第一个目标称之为 最终目的。edit目标是该makefile中第一个目标,因此他是终极目标。
在上述的例子中,edit做为最终目标,其依赖于其他.o文件.makefile在执行最终目标的命令前,首先处理依赖文件的更新规则
目标.o文件不存在,则用其描述规则创建它
目标.o文件村则时,目标.o文件比它的任何一个依赖文件的.c源文件,.h文件"更新"则什么也不做,否则重新编译该.o文件。
完成了.o文件的创建后对edit进行编译:
当edit不存在时,创建edit
当edit存在时,则检查更新。
在上述的例子中可以发现,一旦依赖文件过多的时候,尤其是edit ,有众多的.o文件,而且需要写两次,容易出错。因此使用变量代替这些众多的文件,这样显得更简洁:
objects = main.o result.o lost.o cool.o visual.o
edit:$(objects)
cc-c edit $(objects)
.....
makefile本身存在一个默认规则,可以省去许多荣誉。在makefile中,我们只需要给出需要重建的目标文件名,make会自动将这个.o文件寻找合适的依赖文件(对应的.c文件,.o的文件名与.c的文件名一样)
上述例子可以写成:
objects = main.o ........
edit:$(objects)
main.o: main.h
result.o: result.h
lost.o: lost.h ..
........