• MSBuild使用——构建C/C++项


    1. MSBuild可以Build C#项目,能否Build C/C++开发的项目 
    
    答案当然是可以。C/C++项目文件为.vcproj。 
    
    (1)使用VCBuild任务 
    
    包装 vcbuild.exe,该执行程序生成 Visual C++ 项目和包含 Visual C++ 项目的解决方案。 
    
    必选参数:Projects:指定要生成的项目。 
    
    (2)使用MSBuild任务 
    
    基于另一个 MSBuild 项目生成 MSBuild 项目。 
    
    必选参数:Projects:指定要生成的项目。 
    
    与使用Exec任务调用 MSBuild.exe 不同,此任务使用同一个 MSBuild 进程来生成子项目。可以跳过的已生成目标列表在父生成进程与子生成进程之间共享。此外,此任务的速度更快,因为它不创建任何新的 MSBuild 进程。 
    
    此任务不但可以处理项目文件,而且还可以处理 Visual Studio 2005 解决方案文件。 
    
    (但通过MSBuild任务Build C++项目会产生一个warning) 
    
    (3)使用Exec任务,使其执行vcbuild.exe命令 
    
    Exec任务:运行带有指定参数的指定程序或命令。 
    
    必选参数:Command:要运行的命令。这可以是系统命令,如 attrib,也可以是可执行文件,如 program.exe。 
    
    vcbuild.exe:D:Program FilesMicrosoft Visual Studio 8VCvcpackagesvcbuild.exe 
    
    (4 )使用Exec任务,使其执行devenv.com命令 
    
    Devenv 允许您设置集成开发环境 (IDE) 的各个选项,以及从命令行生成、调试和部署项目。使用这些开关从脚本或 .bat 文件(如每夜生成的脚本)运行 IDE,或以特定配置启动 IDE。 
    
    详细参考:http://msdn.microsoft.com/zh-cn/library/xee0c8y7.aspx 
    
    http://msdn.microsoft.com/en-us/library/xee0c8y7(VS.80).aspx 
    
    2. 例子 
    
    启动VS2005,建立C++项目,名称为TestMSBuild,存于C:根目录下,并选中“Create directory for solution”(为解决方案建立目录)。在此例中,我们只是演示如何使用VCBuild、MSBuild和Exec任务Build C++项目,故对VS2005自动生成的TestMSBuild代码不做任何修改。其生成的TestMSBuild.vcproj在C:TestMSBuildTestMSBuild目录下。 
    
    (1)使用VCBuild任务 
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="BuildCppProject"> 
    <VCBuild 
    Projects="TestMSBuildTestMSBuildTestMSBuild.vcproj" 
    Configuration="Release|Win32" 
    Rebuild="true"/> 
    <VCBuild 
    Projects=".TestMSBuildTestMSBuildTestMSBuild.vcproj" 
    Configuration="Debug|Win32" 
    Rebuild="true"/> 
    <VCBuild 
    Projects="C:TestMSBuildTestMSBuildTestMSBuild.vcproj" 
    Configuration="Release|x64" 
    Rebuild="true"/> 
    </Target> 
    </Project> 
    通过执行VCBuild任务,可以可以在Win32平台和x64平台上生成TestMSBuild项目的Debug版和Release版。 
    
    另外,参数的定义,不仅可以通过ItemGroup(项集),也可以通过PropertyGroup(属性集),也可以通过二者的相互嵌套、或者属性的嵌套来实现。其中的路径也可以使用相对路径和绝对路径。例如,该例也可以写为: 
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <ProjectReferences1 Include="TestMSBuildTestMSBuildTestMSBuild.vcproj" /> 
    <ProjectReferences2 Include=".TestMSBuildTestMSBuildTestMSBuild.vcproj" /> 
    <ProjectReferences3 Include="C:TestMSBuildTestMSBuildTestMSBuild.vcproj" /> 
    </ItemGroup> 
    
    <Target Name="BuildCppProject"> 
    <VCBuild 
    Projects="@(ProjectReferences1)" 
    Configuration="Release|Win32" 
    Rebuild="true"/> 
    <VCBuild 
    Projects="@(ProjectReferences2)" 
    Configuration="Debug|Win32" 
    Rebuild="true"/> 
    <VCBuild 
    Projects="@(ProjectReferences3)" 
    Configuration="Release|x64" 
    Rebuild="true"/> 
    </Target> 
    </Project> 
    或者通过属性集嵌套项集,写为: 
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <FilePath>TestMSBuild</FilePath> 
    <ProjFileName>TestMSBuildTestMSBuild.vcproj</ProjFileName> 
    </PropertyGroup> 
    
    <ItemGroup> 
    <ProjectReferences1 Include="$(FilePath)$(ProjFileName)" /> 
    <ProjectReferences2 Include=".$(FilePath)$(ProjFileName)" /> 
    </ItemGroup> 
    
    <Target Name="BuildCppProject"> 
    <VCBuild 
    Projects="@(ProjectReferences1)" 
    Configuration="Release|Win32" 
    Rebuild="true"/> 
    <VCBuild 
    Projects="@(ProjectReferences2)" 
    Configuration="Debug|Win32" 
    Rebuild="true"/> 
    </Target> 
    </Project> 
    注:该写法完全参数化,提高了灵活性,是较常用的写法。 
    
    (2)使用MSBuild任务 
    
    通过执行MSBuild任务,直接Build该项目,实际上MSBuild任务在执行时,发现是C++项目,也会自动调用VCBuild任务。而实际上VCBuild任务即是在执行vcbuild.exe命令。但使用MSBuild、VCBuild任务和使用Exec任务执行vcbuild.exe命令,方式不一样,速度也不相同。此任务使用同一个 MSBuild 进程来生成子项目,可以跳过的已生成目标列表在父生成进程与子生成进程之间共享。此任务的速度更快,因为它不创建任何新的 MSBuild 进程。该方法会产生一个warning。  
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <ProjectReferences Include=".TestMSBuildTestMSBuildTestMSBuild.vcproj" /> 
    </ItemGroup> 
    
    <Target Name="BuildCppProject"> 
    <MSBuild 
    Projects="@(ProjectReferences)" 
    Properties="Configuration=Release;Optimize=$(Optimize)" 
    Targets="Build"> 
    <Output 
    TaskParameter="TargetOutputs" 
    ItemName="AssembliesBuiltByChildProjects" /> 
    </MSBuild> 
    </Target> 
    </Project> 
    也可以通过MSBuild任务直接处理TestMSBuild项目的解决方案文件。 
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <ProjectReferences Include=".TestMSBuildTestMSBuild.sln" /> 
    </ItemGroup> 
    
    <Target Name="BuildCppProject"> 
    <MSBuild 
    Projects="@(ProjectReferences)" 
    Properties="Configuration=Release;Optimize=$(Optimize)" 
    Targets="Build"> 
    <Output 
    TaskParameter="TargetOutputs" 
    ItemName="AssembliesBuiltByChildProjects" /> 
    </MSBuild> 
    </Target> 
    </Project>3)使用Exec任务,使其执行vcbuild.exe命令 
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <VCBuildCommand>"D:Program FilesMicrosoft Visual Studio 8VCvcpackagesvcbuild.exe"</VCBuildCommand> 
    <VCProjectFile>".TestMSBuildTestMSBuildTestMSBuild.vcproj"</VCProjectFile> 
    <Configuration>"Release|Win32"</Configuration> 
    </PropertyGroup> 
    
    <Target Name="BuildVCProject"> 
    <Exec Command="$(VCBuildCommand) /rebuild $(VCProjectFile) $(Configuration)" /> 
    </Target> 
    </Project> 
    通过Exec任务执行vcbuild.exe命令,Build速度较慢,其执行过程如下图所示。 
    
    (4 )使用Exec任务,使其执行devenv.com命令 
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <DevenvCommand>"D:Program FilesMicrosoft Visual Studio 8Common7IDEdevenv.com"</DevenvCommand> 
    <SolutionFile>".TestMSBuildTestMSBuild.sln"</SolutionFile> 
    </PropertyGroup> 
    
    <Target Name="BuildVCProject"> 
    <Exec Command="$(DevenvCommand) /clean Release $(SolutionFile)" /> 
    <Exec Command="$(DevenvCommand) /build Release $(SolutionFile)" /> 
    <Exec Command="$(DevenvCommand) /clean Debug $(SolutionFile)" /> 
    <Exec Command="$(DevenvCommand) /build Debug $(SolutionFile)" /> 
    </Target> 
    </Project> 
    实际上,通过Exec任务执行devenv.com命令,也可以直接在命令行窗口写入如下命令: 
    
    devenv /clean Release C:TestMSBuildTestMSBuild.sln 
    devenv /build Release C:TestMSBuildTestMSBuild.sln 
    devenv /clean Debug C:TestMSBuildTestMSBuild.sln 
    devenv /build Debug C:TestMSBuildTestMSBuild.sln 
    注意:本文中的测试文件均为.csproj文件,要使用相对路径,须将这些.csproj文件放在C:根目录下。 
  • 相关阅读:
    Linux部署golang程序(无数据库访问)
    MySQL备份数据库mysqldump
    Linux命令netstat
    SQL优化01(转载)
    springcloud之gateway点滴
    关于数据库错误:serverTimeZone
    代码重构的重要性
    关于集合的泛型
    python 视频下载神器(you-get)
    linux下ssh
  • 原文地址:https://www.cnblogs.com/quke123/p/4101911.html
Copyright © 2020-2023  润新知