2.4.1 make工具是什么
在DOS时期编写汇编程序的时候,编译器和链接器基本上不用什么参数,命令只有区区两条:
Masm xxx.asm;
Link xxx.obj;
只要做个批处理把xxx换成%1,然后在命令行键入asm.bat xxx就万事大吉了,很是方便。Win32编程就不一样了,不管编译器还是链接器都需要加上必要的选项,文件列表也多了起来,如链接器的命令行参数中要列出obj,lib,res和def等多种文件,又多了资源编译这一步,如果用批处理实现,要加的参数太多太乱,而每次用手工一行行地键入命令的话,那对程序员来说简直就是一场灾难。当然,一种简单的解决办法就是为每个编程项目单独建立一个批处理,每次改动后,运行批处理把所有模块重新编译一次,但是当程序很庞大的时候,这将花费很长时间,那么该如何处理呢?这时候就要用到make工具来维护代码了,从网上下载Win32汇编的例子程序时,常常发现除了*.asm和*.rc文件外,例子文件包中往往还有一个makefile文件,这就是给make工具用的。
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式——通过调用makefile文件中用户指定的命令来进行编译和链接的。但是,批处理会执行全部命令将全部源文件编译,包括那些不必重新编译的源文件,而make工具则可根据目标文件上一次编译的时间和所依赖的源文件的更新时间自动判断应当编译哪些源文件,对没有更新过的文件不会处理,这样就可以大大提高程序调试的效率。
举例说明,我们要写一个test.exe文件,生成最后的可执行文件有4个步骤:
(1)汇编源文件x.asm,其中用到头文件common.inc,它们经Ml.exe编译成x.obj;
(2)汇编源文件y.asm,用到头文件common.inc和y.inc,它们经Ml.exe编译成y.obj;
(3)资源脚本文件x.rc,经Rc.exe编译成x.res;
(4)最后用Link将x.obj,y.obj和x.res链接成test.exe。
可以看出,当程序调试的时候,如果修改了x.asm,也就是说x.obj的文件时间比x.asm要早,就需要重新进行步骤(1)和(4);如果修改了y.asm或y.inc,那么需要重新执行步骤(2)和(4);如果修改的是x.rc,则步骤(3)和(4)必须重新执行;如果修改的是common.inc,因为x.asm和y.asm都和它有关,所以步骤(1)、(2)和(4)都要重新执行;如果同时修改了common.inc和x.rc,那么必须重复全部步骤。在这个例子中,文件的依赖关系就是:
● test.exe依赖于x.obj,y.obj和x.res;
● x.res依赖于x.rc;
● x.obj依赖于x.asm和common.inc;
● y.obj依赖于y.asm,common.inc和y.inc。
make可以根据文件的时间正确判断文件的新旧并执行相应的步骤。但make又是如何知道文件之间的依赖关系呢?这需要用户用一个描述文件来指定。前面提到的makefile就是这个描述文件,执行make工具的时候,它会默认用makefile做描述文件名来进行相应的工作,书写描述文件有规定的语法,虽然语法不是很简单,但写好以后就省事多了。
Microsoft的make工具文件名为nmake.exe,它并不是MASM软件包的一部分,但可以在Visual C++的Bin目录下找到。Borland公司的make工具文件名是make.exe,它已经包括在TASM 5.0工具包中。两者默认的描述文件名都是makefile,描述文件的语法也大同小异,只是使用时命令行参数有些不同。






