makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了。
# this is a makefile #这一行是注释
NAME = MemInfo.exe #下来这几行是宏定义,相当于linux的变量
OBJS = $(NAME).obj
RES = $(NAME).res
LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff
$(NAME): $(OBJS) $(RES) #这一行指出最终生成的exe文件依赖哪些obj和res文件
Link $(LINK_FLAG) $(OBJS) $(RES) #这一行是生成exe时执行的链接命令;
.asm.obj: #这一行表示.asm文件转成.obj文件要使用下边这个语句
ml $(ML_FLAG) $< #这一行是使用.asm转.obj的编译命令;$<表示对当前目录下所有.asm文件进行编译且编译生成的.obj文件使用和原来.asm文件一样的名字
.rc.res: #这一行表示.rc文件转成.res文件要使用下边这个语句
rc $< #这一行是使用.rc转.res的编译命令;$<表示对当前目录下所有.rc文件进行编译且编译生成的.res文件使用和原来.rc文件一样的名字
clean: #这一行表示最后要执行以下的清除命令
del *.obj #删除当前目录下的所有.obj文件
del *.res #删除当前目录下的所有.res文件
我们手动编译的过程是:通过rc编译资源文件,通过ml编译源文件,通过link连接程序。
makefile其实就是用于指导make程序完成这几件事,makefile就是由obj/res转exe的链接规则、asm转obj的编译规则、rc转res的编译规则和清除中间文件的规则等四种规则组成;不过为了方便还引入了注释和宏定义,这并不难理解。
makefile文件规则分为显式规则和隐含规则两种。
显示规则指的是明确指出了生成的文件叫什么、由哪几个文件生成的规则。比如上边obj/res转exe的链接规则是显式规则:其明确指出生成文件叫MemInfo.exe,且是由MemInfo.obj和MemInfo.res两个文件生成。
隐含规则指的是不具体指出具体文件名只指出文件扩展名的规则。比如asm转obj的编译规则中只是通过.asm.obj指出将asm文件转成obj文件,并没有具体指出哪个asm文件转成obj文件。同理rc转res的编译规则和清除中间文件的规则也都是隐式规则。
但是要注意不是说可以简单地归类为:obj/res转exe的链接规则是显式文件,而asm转obj的编译规则等其他三种规则是隐式文件。当exe由obj和res两种文件组成时其必然得是显式规则,但如果只由obj文件组成那就可以写成隐式规则;而asm转obj的编译等其他三种规则只要不嫌麻烦也完全可以写成一条条的显式规则。
或者叫,显式规则适用于从某几个文件到某个文件,隐式规则适用于从一类文件到另一类文件。