哈哈,刚开始由于对nmake一点也不理解,一直把它放到程序的最后一步,结果刚刚才发现它的好处,真后悔没有第一步先研究nmake呀,。。下面是我在学习nmake时做的一些笔记,希望一些朋友有帮助。。
============================================
刚学习nmake的时候,第一件事当然是去查msdn的资料库,下面的链结是msdn中有关nmake的资料:
英文版 中文版
大家可以去msdn上的网站上看看,个人认为里面介绍了很多nmake的细节,我刚开始去那看的时候,并没有看懂,反而让我觉的nmake好像很难的样子。。。不过你要是想彻底理解nmake的用处,那上面二个链结可是非常有用的。。
关于nmake的定义,在<
>一书中,作者是这样定义的:
"nmake is Microsoft's version of the UNIX make tool, and a version is inluded with the .NET platform SDK. nmake processes a makefile, which indicates how to build each target(often an output file) and lists dependencies between files involved in the build process."
我没有C或者UNIX的编程经验,而我在网上查找资料的时候,都有提到nmake在C语言和UNIX编程中的广泛应用,而如上定义,在.NET中的nmake,其实是一种微软版的Unix工具,并且包含在.NET 平台中。
要执行nmake,不能少了它的好伙伴,makefile,而这个makefile文件则包含了实际的代码。举个例子:
我们需要创建一个AutoBox.dll,而这个文件是根据AutoBox.cs创建而来的,换句话说,如果我们改变了AutoBox.cs的代码,那么 AutoBox.dll文件也要随之改变,那么在makefile文件中就包含了类似的信息以及将AutoBox.cs转换成AutoBox.dll文件的代码。
我们就以AutoBox.dll和UseBox.exe为实例说明,以下是创建的步骤:
首先创建一个makefile文件,存放在和你的source 文件一个目录下。
将以下代码输入到makefile文件中。
2 .
3 . AutoBox.dll: AutoBox.cs
4 . csc / t:library AutoBox.cs
5 .
6 . UseBox.exe: UseBox.cs
7 . csc / r:AutoBox.dll UseBox.cs
8 .
9 . clean:
10 . - del * .exe
11 . - del * .dll
注明:代码中的每行前面的数字不是代码的一部份,只是为了方便代码的解释
第1行:all代表所有的目标文件(targes),在这个例子中,只有AutoBox.dll和UseBox.exe
第3-4行:代表target所依靠的文件以及编译target的方法,在这个例子中,AutoBox.dll是随着AutoBox.cs的改变而改变的,也就是说,一旦AutoBox.cs的代码改变了,那么AutoBox.dll文件也要随之改变。而第4行则是将AutoBox.cs编译成library文件的方法。
第6-7行:完全类似第3-4行的代码,而第7行则是将主程序文件编译成可执行文件的方法。
第9-11行:clean类似all,然后它并不去鉴别输出的文件,它只是指明了将清楚除source文件以外其它的文件,
正如第10-11行所写,这个makefile文件将会清楚除了AutoBox.dll和UseBox.exe文件之外其它的exe文件和dll文件。
在上面的代码输入完之后,存盘退出,然后记的要将makefile放入和你的project一个目录下面。然后直接执行nmake 就可以了。nmake会自动寻找makefile文件,如果你的makefile文件有代码错误,nmake也会打出相应的错误信息,让你修改。如果一切正常,nmake则会自动按照makefile中所输入的代码,进行编译。并最终输出二个文件:AutoBox.dll和UseBox.exe
这时候,有人就会问,那我直接将编译所需的C# command写入一个.bat文件不就行了,为什么要这么麻烦使用nmake呢?呵呵,你试一下你就知道了,如果你将c# command写入一个.bat文件,你也可以得到类似的功能,然后当你运行这个.bat文件时,你将会将不必要重新编译的文件也编译了,这完全是浪费资源的表现,而且如果只是个小程序也就罢了,如果是个大的项目,呵呵,你就只能盯着屏幕看,到底是哪个文件出了错,这一盯,估计也得好几十分钟吧。。这简直就是自杀。。
比如说:
你将以下C# command写入run.bat中:
csc /t:library AutoBox.cs
csc /r:AutoBox.dll UseBox.cs
这样你每次运行run.bat,程序会首先编译AutoBox.cs然后再编译UseBox.cs,第一次执行,没问题,然而如果你修改了 UseBox.cs文件,需要重新编译,这个run文件则会将不需要编译的AutoBox也重新编译一次。然而,使用nmake就不会有这种问题了。。
一旦你执行了nmake,程序会自动检测,AutoBox.cs和UseBox.cs这二个文件有哪个文件是被修改了,然后它将会把修改的那个文件编译。比方说,程序检测到UseBox.cs文件已经被修改过,于是它只将UseBox.cs文件重新编译,而AutoBox则没有进行任何动作。这样的话,将大大节约了时间,而且当编译一个大项目时,你也可以轻而以举的找出是哪个文件编译有误,哪个文件已经被修改等等。这也是为什么我一开始说,nmake应该在第一步就研究。。
============================================
ok,上面就是我这次学习nmake的成果,希望对朋友们有些帮助。。有错误的地方,还望能告诉一声,好让我不至于继续误导大家,呵呵。