对于.NET中的NMake和Makefile的理解。

Posted on 2004-10-24 08:59 Ray Chang 阅读(2950) 评论(6)  编辑 收藏 所属分类: .NET

哈哈,刚开始由于对nmake一点也不理解,一直把它放到程序的最后一步,结果刚刚才发现它的好处,真后悔没有第一步先研究nmake呀,。。下面是我在学习nmake时做的一些笔记,希望一些朋友有帮助。。
============================================
刚学习nmake的时候,第一件事当然是去查msdn的资料库,下面的链结是msdn中有关nmake的资料:

  英文版                中文版                

大家可以去msdn上的网站上看看,个人认为里面介绍了很多nmake的细节,我刚开始去那看的时候,并没有看懂,反而让我觉的nmake好像很难的样子。。。不过你要是想彻底理解nmake的用处,那上面二个链结可是非常有用的。。

关于nmake的定义,在<<Programming in the .NET Environment>>一书中,作者是这样定义的:
"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文件中。

 1.   all: AutoBox.dll UseBox.exe
 
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的成果,希望对朋友们有些帮助。。有错误的地方,还望能告诉一声,好让我不至于继续误导大家,呵呵。





Feedback

#1楼 [楼主]   回复  引用  查看    

2004-10-30 22:29 by 常建昭      
补充一点:
我的makefile的格式是没有extension的,也就是说没有后缀,单纯的一个makefile。。。。

#2楼    回复  引用  查看    

2005-08-27 14:22 by 蛙蛙池塘      
有用。

#3楼    回复  引用    

2006-04-15 14:33 by sabrina [未注册用户]
不错。很有用!

#4楼    回复  引用    

2006-05-17 17:43 by Stiffree [未注册用户]
很不错,分享的人值得尊敬!

#5楼    回复  引用    

2006-05-17 21:55 by 常建昭 [未注册用户]
:), Thank you.

#6楼    回复  引用    

2006-08-15 17:18 by Nmake [未注册用户]
Nmake的隐式规则有解说么?我怎么也看不懂似的,惭愧啊。例子如下:

{}.cxx{$(_OBJDIR)\}.obj:
@type <<
$(ECHO_CXX_MSG)
<<NOKEEP
@$(CXXCOMPILER) @<< $(CONLY_FLAGS) -Fo$@
$(CFLAGS: =
) $(MAKEDIR)\$<
<<NOKEEP
!IF "$(_XREF_GEN_DATA)" != ""
XrefCppfile $(_TGTCPU) $(WINCEDEBUG) $(MAKEDIR)\$< @<< -DXREF_CPP_FILE $(CONLY_FLAGS) -Fo$@
$(CFLAGS: =
) $(MAKEDIR)\$<
<<NOKEEP

Thanks

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-24 09:11 编辑过


相关链接:
 



posts - 63, comments - 179, trackbacks - 5, articles - 8

Copyright © Ray Chang