哈哈,剛開始由於對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檔案中。
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的成果,希望對朋友們有些協助。。有錯誤的地方,還望能告訴一聲,好讓我不至於繼續誤導大家,呵呵。