发信人: galfordli() 
整理人: wenbobo(2002-12-06 23:28:13), 站内信件
 | 
 
 
    make文件其实就是一种批操作文件,将一系列命令行的编译连接命令
 
 写成一个文本文件,供nmake.exe程序调用,在命令行方式下运行nmake
 
 就可以生成所需的文件,其效果和IDE中的BUILD类似。
 
 先简单介绍一下几个必要的工具(nmake当然是必不可少的了,但它的
 
 使用比较简单,就不提了)。ml.exe/cl.exe作用是将汇编源程序或
 
 c源程序编译连接成可执行文件(ml就是masm和link),其后可以加上
 
 命令行选项(开关)对编译连接的过程进行控制。另一个程序是link.exe,
 
 当然就是对obj文件作连接的啦。它不但可以生成exe文件,还可以生
 
 成DLL和VxD(这也是我采用命令行方式的主要原因)。关于ml.exe和link.exe
 
 的命令行选项很多,这里也不可能一一解释,详细说明可以看帮助(masm6或MSD N上都有)。
 
     如果会用ml和link进行编译连接了,那make文件就很容易写了。
 
 一. 依赖规则:
 
      make文件由依赖规则(Dependent Rulers)组成,基本结构是指定
 
 目标文件(Targets)及其依赖文件(Dependents),然后定义目标文件
 
 如何形成(当然是用ml和link了,也有其他的,我们下边会看到)。
 
 具体格式是:
 
             目标文件:依赖文件
 
 		命令行
 
 例如有源文件myasm.asm和myasm.inc,依赖规则就可以写成
 
 		myasm.obj:myasm.asm myasm.inc
 
 			ml /c myasm.asm 
 
 nmake还支持通用依赖规则(Inference Rules),例如我们可以将由
 
 asm文件到obj文件的规则写成一个通用依赖规则(一个asm文件生成一个obj文件 )
 
 		.asm.obj:
 
 		        ml /c $*.asm
 
 这样我们就不用一遍一遍的写ml......了,只要写出目标文件和依赖
 
 文件就行了。这里$*是一个预定义宏,下面就讲一下宏的应用。
 
 二. 宏的定义和引用:
 
      首先是定义宏。很简单,用"="就行了,例如我们可以将ml的命
 
 令行选项串(就是多个选项啦,一时想不出用什么词描述了,可能用词不
 
 当了)定义成一个宏AFLAGS:
 
 		AFLAGS= /C /Zi /Sn
 
 使用时用$(宏名)的形式,即nmake执行时会将AFLAGS替换成/C /Zi /Sn,
 
 怎么样,简单吧。
 
      而前面用到的$*表示不带扩展名的目标文件名(这样才通用嘛),
 
 向这样的预定义宏还有很多,如$@,表示目标文件的完整文件名,$< 
 
 表示比目标文件时间更新的依赖文件名,等等。 
 
 三. 例子:
 
      讲了这么多不知道大家是否已经糊涂了,下面就给出一个完整的
 
 例子,这个例子来自DDK,为了大家看得清楚,我先将源文件贴出,而
 
 下一篇是带注释的。
 
 
 
 
 
 #                                                                            *
 
 # THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF AN Y     *
 
 # KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE        *
 
 # IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULA R     *
 
 # PURPOSE.                                                                   *
 
 #                                                                            *
 
 # Copyright (C) 1993-95  Microsoft Corporation.  All Rights Reserved.        *
 
 #                                                                            *
 
 #********************************************************************* *******
 
 #                                                                           
 
 #       Makefile for serial device
 
 #
 
 ###################################################################### ####
 
 
 
 !ifdef MASTER_MAKE
 
 BUILD_BITS=32
 
 BUILD_TYPE=comm
 
 !INCLUDE $(DDKROOT)\master.mk
 
 !endif
 
 
 
 DEVICE = SERIAL
 
 
 
 OBJS = serial.obj serutil.obj serfunc.obj serinit.obj serdbg.obj
 
 
 
 ########## Definitions ###############################
 
 
 
 ASM     = ml
 
 AFLAGS  = -coff -DBLD_COFF -DIS_32 -nologo -W2 -Zd -c -Cx -DMASM6
 
 ASMENV  = ML
 
 
 
 LFLAGS  = /VXD /NOD
 
 
 
 ############## VxD device link rule ###################
 
 
 
 .asm.obj:
 
 	set $(ASMENV)=$(AFLAGS)
 
 	$(ASM) -Fo$*.obj $< 
 
 
 
 $(DEVICE).SYM: $(DEVICE).MAP 
 
 	mapsym -s -o $(DEVICE).sym $(DEVICE).map
 
 
 
 $(DEVICE).VXD $(DEVICE).MAP: $(OBJS)
 
 	link @<<$(DEVICE).lnk /DEF:<<$(DEVICE).def
 
 $(LFLAGS)
 
 /OUT:$(DEVICE).VXD
 
 /MAP:$(DEVICE).map
 
 $(OBJS)
 
 <<
 
 VXD $(DEVICE) DYNAMIC
 
 DESCRIPTION '$(DEVICE) Device'
 
 
 
 SEGMENTS
 
 	_LPTEXT  CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	_LTEXT   CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	_LDATA   CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	_TEXT    CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	_DATA    CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	CONST    CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	_BSS     CLASS 'LCODE'   PRELOAD NONDISCARDABLE
 
 	_ITEXT   CLASS 'ICODE'   DISCARDABLE
 
 	_IDATA   CLASS 'ICODE'   DISCARDABLE
 
 	_PTEXT   CLASS 'PCODE'   NONDISCARDABLE
 
 	_PDATA   CLASS 'PCODE'   NONDISCARDABLE
 
 	_STEXT   CLASS 'SCODE'   RESIDENT
 
 	_SDATA   CLASS 'SCODE'   RESIDENT
 
 	_16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
 
 	_RCODE   CLASS 'RCODE'
 
 EXPORTS
 
 	$(DEVICE)_DDB @1
 
 <<
 
 
 
 clean:
 
 	-@del *.obj
 
 	-@del *.lib
 
 	-@del *.exp
 
 	-@del *.map
 
 	-@del *.sym
 
 	-@del *.vxd
 
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.77.71]
  | 
 
 
 |