在Visual Studio 2010的安装目录中(C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin),有一个nmake.exe的可执行文件,在进行某些命令行编译时,会使用到这个文件。以下解释来自百度百科:
Microsoft Program Maintenance Utility,外号NMAKE,顾名思义,是用来管理程序的工具。其实说白了,就是一个解释程序。它处理一种叫做makefile的文件(以mak为后缀),解释里面的语句并执行相应的指令。我们编写makefile文件,按照规定的语法描述文件之间的依赖关系,以及与该依赖关系相关联的一系列操作。然后在调用NMAKE时,它会检查所有相关的文件,如果目标文件(target file,下文简称target,即依赖于其它文件的文件)的time stamp(就是文件最后一次被修改的时间,一个32位数,表示距离1980年以来经过的时间,以2秒为单位)小于依赖文件(dependent file,下文简称dependent,即被依赖的文件)的时间标识(time stamp),NMAKE就执行与该依赖关系相关联的操作。
请看下面这个例子:
foo.exe : first.obj second.obj
link first.obj,second.obj
第一行定义了依赖关系,称为dependency line;
第二行给出了与该依赖关系相关联的操作,称为command line。
因为foo.exe由first.obj和second.obj连接而成,所以说foo.exe依赖于first.obj和 second.obj,即foo.exe为target,first.obj和second.obj为dependent。如果first.obj和 second.obj中的任何一个被修改了(其time stamp更大),则调用link.exe,重新连接生成foo.exe。
这就是NMAKE的执行逻辑。
综上,NMAKE的核心就是这3个家伙——依赖关系,操作和判定逻辑(target.timestamp < dependent.timestamp,如果为true,就执行相应操作)。
在命令行键入nmake /? 可以显示帮助信息,nmake的语法如下:
nmake [选项] [/f 描述文件名] [/x 输出信息文件名] [宏定义] [目标]
说明如下:
● /f参数——如果描述文件名不使用默认的makefile,可以用/f参数指定。
● /x参数——如果想把屏幕输出的信息存到一个文件中,可以用/x参数指定(用DOS下的管道操作符nmake > 文件名的方法无效)。
● 宏定义——可以用新的定义覆盖描述文件中的宏定义。
● 目标——指定建立描述文件中描述的某个文件,如上面的例子中默认是生成最后的test.exe文件,也可以用nmake x.res指定更新x.res文件。
/A
不检测文件时间,强制更新所有文件
/B
文件时间相等时也要更新文件
/D
make时显示文件新旧信息
/N
显示make时要执行的命令,但并不真正执行
/P
一个比较有用的选择,make时显示详细的信息
由于nmake的应用是基于文件时间的,当计算机的时钟不准确或文件拷贝到另一台计算机后文件时间有些偏差,那么文件的更新可能会不正确,这时最好用/A选项强制把所有文件更新一遍。在平时使用的时候,以makefile当做建立的描述文件名,那么仅键入不加参数的nmake命令就可以完成所有工作了。
Microsoft Program Maintenance Utility,外号NMAKE,顾名思义,是用来管理程序的工具。其实说白了,就是一个解释程序。它处理一种叫做makefile的文件(以mak为后缀),解释里面的语句并执行相应的指令。我们编写makefile文件,按照规定的语法描述文件之间的依赖关系,以及与该依赖关系相关联的一系列操作。然后在调用NMAKE时,它会检查所有相关的文件,如果目标文件(target file,下文简称target,即依赖于其它文件的文件)的time stamp(就是文件最后一次被修改的时间,一个32位数,表示距离1980年以来经过的时间,以2秒为单位)小于依赖文件(dependent file,下文简称dependent,即被依赖的文件)的时间标识(time stamp),NMAKE就执行与该依赖关系相关联的操作。
请看下面这个例子:
foo.exe : first.obj second.obj
link first.obj,second.obj
第一行定义了依赖关系,称为dependency line;
第二行给出了与该依赖关系相关联的操作,称为command line。
因为foo.exe由first.obj和second.obj连接而成,所以说foo.exe依赖于first.obj和 second.obj,即foo.exe为target,first.obj和second.obj为dependent。如果first.obj和 second.obj中的任何一个被修改了(其time stamp更大),则调用link.exe,重新连接生成foo.exe。
这就是NMAKE的执行逻辑。
综上,NMAKE的核心就是这3个家伙——依赖关系,操作和判定逻辑(target.timestamp < dependent.timestamp,如果为true,就执行相应操作)。
在命令行键入nmake /? 可以显示帮助信息,nmake的语法如下:
nmake [选项] [/f 描述文件名] [/x 输出信息文件名] [宏定义] [目标]
说明如下:
● /f参数——如果描述文件名不使用默认的makefile,可以用/f参数指定。
● /x参数——如果想把屏幕输出的信息存到一个文件中,可以用/x参数指定(用DOS下的管道操作符nmake > 文件名的方法无效)。
● 宏定义——可以用新的定义覆盖描述文件中的宏定义。
● 目标——指定建立描述文件中描述的某个文件,如上面的例子中默认是生成最后的test.exe文件,也可以用nmake x.res指定更新x.res文件。
/A
不检测文件时间,强制更新所有文件
/B
文件时间相等时也要更新文件
/D
make时显示文件新旧信息
/N
显示make时要执行的命令,但并不真正执行
/P
一个比较有用的选择,make时显示详细的信息
由于nmake的应用是基于文件时间的,当计算机的时钟不准确或文件拷贝到另一台计算机后文件时间有些偏差,那么文件的更新可能会不正确,这时最好用/A选项强制把所有文件更新一遍。在平时使用的时候,以makefile当做建立的描述文件名,那么仅键入不加参数的nmake命令就可以完成所有工作了。