這篇文章,主要是介紹如何利用批處理去進行工程的批編譯。這樣就不用去將一個應用程式引用到其他所有工程庫逐個開啟編譯了,方便開發。同時可以通過makefile去查看工程之間的依賴庫。
其實我們編譯,要麼就是直接利用IDE進行編譯,要麼使用.bat批處理進行。
下面主要介紹VS2008的IDE vcbuild.exe去實現工程批處理編譯的實現,至於VC6.0,VS2010下對應IDE的批處理實現,都類似的(VC6.0的IDE是MSDEV.exe,VS2010的IDE是msbuild.exe)。
1.我們批編譯會用到.mak檔案,所以我們需要編寫一個.mak檔案,如CAPILuaDemo.mak,裡面主要就是你需要編譯的所有工程(建議所有工程都已經實現按照規範的配置路徑配置好)。關於.mak中的一些宏文法,可以MSDN中查nmake的相關文法。
NMAKE Macro的定義
macroname=string NMAKE Macro的使用
|
下面貼上代碼
#-----------------------------------------------------------------------------# Path definition#-----------------------------------------------------------------------------#--------此處建議用相應開發環境的IDE,見名思義嘛DEVENV = "E:\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe"POSTFIX = vcproj!IF "$(CFG)" == "Release"PROJ_CFG = ReleaseLIB_POSTFIX = !ELSEPROJ_CFG = DebugLIB_POSTFIX = _D!ENDIFMAKE_FLAG = /Out ./Build.logBUILD_FLAG = /$(FLAG)#==================================================================================#==================================================================================SRC_LUALIB_LIB_PATH = \Users\taoping\Documents\Visual Studio 2008\Projects\CAPILuaDemo\Src\LibProject\LuaLibSRC_CAPILUA_EXE_PATH = \Users\taoping\Documents\Visual Studio 2008\Projects\CAPILuaDemo\Src\ExeProject\CAPILuaDemoBuildAll: del /Q Build.log#------------LuaLib Lib -------------------------------------------------------------------------------------------#========== LuaLib_Static ======================================================$(DEVENV) "$(SRC_LUALIB_LIB_PATH)\LuaLib.$(POSTFIX)" $(BUILD_FLAG) "$(PROJ_CFG)|Win32" $(MAKE_FLAG)#========== LuaLib_Static ======================================================#------------CAPILuaDemo Exe -------------------------------------------------------------------------------------------#========== CAPILuaDemo ======================================================$(DEVENV) "$(SRC_CAPILUA_EXE_PATH)\CAPILuaDemo.$(POSTFIX)" $(BUILD_FLAG) "$(PROJ_CFG)|Win32" $(MAKE_FLAG)#========== G+MassProductionTool ======================================================
備忘:
在編寫.mak檔案中,如
$(DEVENV) "$(SRC_LUALIB_LIB_PATH)\LuaLib.$(POSTFIX)" $(BUILD_FLAG) "$(PROJ_CFG)|Win32" $(MAKE_FLAG)
#========== LuaLib_Static ======================================================
兩者最好間隔一行,不然容易有問題。
還有像"$(SRC_LUALIB_LIB_PATH)\LuaLib.$(POSTFIX)"中有特殊字元,如空格,底線等,這樣我們需要用雙引號引起來,否則會報錯。
像POSTFIX 等一些指派陳述式,它們都只是宏變數的定義而已,使用該宏變數就這樣$(macroname) 。若是不熟悉MakfeFile文法的,可以去MSDN直接尋找makefile瞭解其相關文法。
2.開啟VS2008工程,建立一個Makefile工程,工程名為CAPILuaDemoMakeFile,在彈出的視窗中,可以直接Finish結束建立視窗,也可以在建立視窗裡或工程屬性裡設定好來,或者關閉工程直接以文本開啟CAPILuaDemoMakeFile.vcproj檔案,在其中添加相應的項。此時我們直接關閉Makefile工程,在該工程工作目錄中就已經有.vcproj專案檔了CAPILuaDemoMakeFile.vcproj。
(我們是利用nmake工具進行批編譯的,若是以文本開啟CAPILuaDemoMakeFile.vcproj檔案,會發現該檔案是個XML格式的文檔,裡面有個VCNMakeTool,VCNMakeTool其實是微軟Tool Chain中的一個工具啦,有興趣的可以將VC建立的exe或者dll庫工程的.vcproj專案檔與makefile.vcproj專案檔開啟比較下就會發現他們是工具鏈是不同的,exe或者dll是Name="VCMIDLTool",至於裡面這個XML文檔裡該填寫些什麼,不熟悉的朋友可以去MSDN尋找下其相關介紹。)
下面貼上該文檔代碼。(裡面有一些沒填寫,是有預設值的)
<?xml version="1.0" encoding="gb2312"?><VisualStudioProjectProjectType="Visual C++"Version="9.00"Name="CAPILuaDemoMakeFile"ProjectGUID="{AC320F53-A504-41FE-8FA3-9BEF7D40AA8D}"Keyword="MakeFileProj"TargetFrameworkVersion="196613"><Platforms><PlatformName="Win32"/></Platforms><ToolFiles></ToolFiles><Configurations><ConfigurationName="Debug|Win32"OutputDirectory="$(ConfigurationName)"IntermediateDirectory="$(ConfigurationName)"ConfigurationType="0"><ToolName="VCNMakeTool"BuildCommandLine="NMAKE /f CAPILuaDemo.mak FLAG=BUILD CFG=Debug"ReBuildCommandLine="NMAKE /f CAPILuaDemo.mak FLAG=REBUILD CFG=Debug"CleanCommandLine=""Output=""PreprocessorDefinitions="WIN32;_DEBUG"IncludeSearchPath=""ForcedIncludes=""AssemblySearchPath=""ForcedUsingAssemblies=""CompileAsManaged=""/></Configuration><ConfigurationName="Release|Win32"OutputDirectory="$(ConfigurationName)"IntermediateDirectory="$(ConfigurationName)"ConfigurationType="0"><ToolName="VCNMakeTool"BuildCommandLine="NMAKE /f CAPILuaDemo.mak FLAG=BUILD CFG=Release"ReBuildCommandLine="NMAKE /f CAPILuaDemo.mak FLAG=REBUILD CFG=Release"CleanCommandLine=""Output=""PreprocessorDefinitions="WIN32;NDEBUG"IncludeSearchPath=""ForcedIncludes=""AssemblySearchPath=""ForcedUsingAssemblies=""CompileAsManaged=""/></Configuration></Configurations><References></References><Files><FilterName="Source Files"Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"></Filter><FilterName="Header Files"Filter="h;hpp;hxx;hm;inl;inc;xsd"UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"></Filter><FilterName="Resource Files"Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"></Filter><FileRelativePath=".\readme.txt"></File></Files><Globals></Globals></VisualStudioProject>
3.接下來,我最後需要做的是編寫一個批次檔.bat,如Rebuild_Debug.bat。其中環境變數VS90COMNTOOLS所代表目錄下的vsvars32.bat批次檔的作用主要是設定環境變數,不信話可以自己開啟看看。
貼上代碼
@call "%VS90COMNTOOLS%vsvars32.bat"@SET DelParam=/S /Q *.ncb *.sbr *.obj *.pch *.pdb *.idb *.exp *.opt *.clw *.bbs *.aps *.plg *.bsc *.lik *.lib@call "%VS90COMNTOOLS%vsvars32.bat"@echo offecho ********** Build Debug CAPILuaDemo Project ************echo ******************************************************@echo oncd C:\Users\taoping\Documents\Visual Studio 2008\Projects\CAPILuaDemo\MakeFile@if exist "Debug" del .\Debug\*.htmcd C:\Users\taoping\Documents\Visual Studio 2008\Projects\CAPILuaDemo\MakeFilevcbuild /showenv CAPILuaDemoMakeFile.vcproj "Debug" /REBUILD
備忘:
若想release編譯,只需要把這句vcbuild /showenv CAPILuaDemoMakeFile.vcproj "Debug" /REBUILD,改成vcbuild /showenv CAPILuaDemoMakeFile.vcproj "Release" /REBUILD
vcbuild 的文法
上面批處理Rebuild_Debug.bat中,有些加了@表示隱藏當前行在視窗顯示。
.bat中使用變數,可以用set設變數,若是不清楚.bat批次檔相關文法的,可以去瞭解下,其實.bat批處理和.mak的MakeFile檔案編寫還是有些文法格式不同的。
cmd解譯器,主要是解釋.bat批次檔和com檔案;
nmake解譯器,主要是解釋MakeFile檔案的;
4.編寫完Rebuild_Debug.bat後,我們只需要雙擊執行該檔案,就可以實現批編譯了。他的執行過程是利用vcbuild去調用nmake,Vcbuild.exe ----> VCNMakeTool.exe -----> NMAKE.exe。
在這裡,我們應該都能感受到微軟作為商業化的產品,有點好的是,協助文檔很多,多的你看不完,我主要是用到才去看的啦。或許這是商業化與開源的一點區別吧。
==================================================================
下面內容來自網路:點擊開啟連結