Makefile批处理

来源:互联网 发布:php开源网站源码 编辑:程序博客网 时间:2024/05/16 12:02

这篇文章,主要是介绍如何利用批处理去进行工程的批编译。这样就不用去将一个应用程序引用到其他所有工程库逐个打开编译了,方便开发。同时可以通过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的使用

$(macroname)

下面贴上代码

#-----------------------------------------------------------------------------# 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。

在这里,我们应该都能感受到微软作为商业化的产品,有点好的是,帮助文档很多,多的你看不完,我主要是用到才去看的啦。或许这是商业化与开源的一点区别吧。

 

==================================================================

下面内容来自网络:点击打开链接

原创粉丝点击