MSBuild使用3——构建C/C++项目
2008-12-04 23:05
337 查看
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
MSBuild使用3——构建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 Files/Microsoft Visual Studio 8/VC/vcpackages/vcbuild.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:/TestMSBuild/TestMSBuild目录下。
(1)使用VCBuild任务
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="BuildCppProject">
<VCBuild
Projects="TestMSBuild/TestMSBuild/TestMSBuild.vcproj"
Configuration="Release|Win32"
Rebuild="true"/>
<VCBuild
Projects="./TestMSBuild/TestMSBuild/TestMSBuild.vcproj"
Configuration="Debug|Win32"
Rebuild="true"/>
<VCBuild
Projects="C:/TestMSBuild/TestMSBuild/TestMSBuild.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="TestMSBuild/TestMSBuild/TestMSBuild.vcproj" />
<ProjectReferences2 Include="./TestMSBuild/TestMSBuild/TestMSBuild.vcproj" />
<ProjectReferences3 Include="C:/TestMSBuild/TestMSBuild/TestMSBuild.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>TestMSBuild/TestMSBuild.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="./TestMSBuild/TestMSBuild/TestMSBuild.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="./TestMSBuild/TestMSBuild.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 Files/Microsoft Visual Studio 8/VC/vcpackages/vcbuild.exe"</VCBuildCommand>
<VCProjectFile>"./TestMSBuild/TestMSBuild/TestMSBuild.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 Files/Microsoft Visual Studio 8/Common7/IDE/devenv.com"</DevenvCommand>
<SolutionFile>"./TestMSBuild/TestMSBuild.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:/TestMSBuild/TestMSBuild.sln
devenv /build Release C:/TestMSBuild/TestMSBuild.sln
devenv /clean Debug C:/TestMSBuild/TestMSBuild.sln
devenv /build Debug C:/TestMSBuild/TestMSBuild.sln
注意:本文中的测试文件均为.csproj文件,要使用相对路径,须将这些.csproj文件放在C:根目录下。
MSBuild使用3——构建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 Files/Microsoft Visual Studio 8/VC/vcpackages/vcbuild.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:/TestMSBuild/TestMSBuild目录下。
(1)使用VCBuild任务
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="BuildCppProject">
<VCBuild
Projects="TestMSBuild/TestMSBuild/TestMSBuild.vcproj"
Configuration="Release|Win32"
Rebuild="true"/>
<VCBuild
Projects="./TestMSBuild/TestMSBuild/TestMSBuild.vcproj"
Configuration="Debug|Win32"
Rebuild="true"/>
<VCBuild
Projects="C:/TestMSBuild/TestMSBuild/TestMSBuild.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="TestMSBuild/TestMSBuild/TestMSBuild.vcproj" />
<ProjectReferences2 Include="./TestMSBuild/TestMSBuild/TestMSBuild.vcproj" />
<ProjectReferences3 Include="C:/TestMSBuild/TestMSBuild/TestMSBuild.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>TestMSBuild/TestMSBuild.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="./TestMSBuild/TestMSBuild/TestMSBuild.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="./TestMSBuild/TestMSBuild.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 Files/Microsoft Visual Studio 8/VC/vcpackages/vcbuild.exe"</VCBuildCommand>
<VCProjectFile>"./TestMSBuild/TestMSBuild/TestMSBuild.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 Files/Microsoft Visual Studio 8/Common7/IDE/devenv.com"</DevenvCommand>
<SolutionFile>"./TestMSBuild/TestMSBuild.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:/TestMSBuild/TestMSBuild.sln
devenv /build Release C:/TestMSBuild/TestMSBuild.sln
devenv /clean Debug C:/TestMSBuild/TestMSBuild.sln
devenv /build Debug C:/TestMSBuild/TestMSBuild.sln
注意:本文中的测试文件均为.csproj文件,要使用相对路径,须将这些.csproj文件放在C:根目录下。
相关文章推荐
- 使用开源C++项目WebSocketpp构建web服务器
- 使用Autotools构建C++项目
- 使用EA构建C++项目的UML图
- IntellijIDEA14中使用maven构建web项目时web-inf下classes的生成
- 使用Maven命令构建项目笔记
- 使用Maven构建多模块项目
- Eclipse使用Maven构建web项目
- 使用Eclipse构建maven项目
- 使用MyEclipse构建MAVEN项目(非WEB项目)
- 在Intellij idea里使用Maven构建一个webapp骨架项目解决一直downloading问题
- Maven学习总结(八)——使用Maven构建多模块项目
- 使用NDK开发C/C++项目规则(ZT)
- Maven学习总结(3)——使用Maven构建项目
- eclipse 使用maven 构建web项目 简单例子
- C++ 项目中使用并发运行库的几种常用方法
- Maven学习总结(八)——使用Maven构建多模块项目
- 使用Eclipse构建Maven的SpringMVC项目
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建(转)
- 使用maven构建web项目实例
- 在linux操作系统上使用eclipse开发C++项目--引用so文件问题