使用单个Visual Studio解决方案同时构建x86和x64?

问题描述:

我有一个x86 Visual Studio解决方案,其中包含许多项目文件。某些DLL被设计为用作用户系统上的其他应用程序的插件。我们正在扩展一些DLL以支持64位应用程序。我想要做的是设置解决方案/项目,这样只需点击“Build”就可以构建这些DLL的x86和x64版本。该解决方案包含C++和C#项目。我意识到“批量构建”能够构建两者,但如果开发人员只需单击以前的相同按钮并生成所有输出DLL,将会更方便。使用单个Visual Studio解决方案同时构建x86和x64?

这里有一对夫妇,我试过一个测试项目的修改,但还没有得到工作:

我已经试过修改<Target Name="AfterBuild">尝试:

<Target Name="AfterBuild" Condition=" '$(Platform)' == 'x86' "> 
    <PropertyGroup> 
    <Platform>x64</Platform> 
    <PlatformTarget>x64</PlatformTarget> 
    </PropertyGroup> 
    <CallTarget Targets="Build"/> 
</Target> 

但导致以下错误:

C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(565,5): error MSB4006: There is a circular dependency in the target dependency graph involving target "Build".

我觉得我的情况会导致无穷递归,但我明白的MSBuild怎么可能不这样认为。

我也试过:

<Project DefaultTargets="MyBuild86;MyBuild64" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
... 
<Target Name="MyBuild86"> 
    <PropertyGroup> 
    <Platform>x86</Platform> 
    <PlatformTarget>x86</PlatformTarget> 
    </PropertyGroup> 
    <CallTarget Targets="Build"/> 
</Target> 
<Target Name="MyBuild64"> 
    <PropertyGroup> 
    <Platform>x64</Platform> 
    <PlatformTarget>x64</PlatformTarget> 
    </PropertyGroup> 
    <CallTarget Targets="Build"/> 
</Target> 

但我DefaultTargets似乎从Visual Studio IDE中忽略。

最后,我试图创建一个单独的项目,进口的第一个项目:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform>x64</Platform> 
    <PlatformTarget>x64</PlatformTarget> 
    <ProductVersion>9.0.30729</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <OutputPath>..\$(Configuration)\x64\</OutputPath> 
    <ProjectGuid>{A885CAC3-2BBE-4808-B470-5B8D482CFF0A}</ProjectGuid> 
    </PropertyGroup> 
    <Import Project="BuildTest.csproj" /> 
</Project> 

,这至今已经显示出了最大的希望。但是,Visual Studio似乎忽略了这个新项目中的设置OutputPath,而是将exe/dll输出到原始项目中指定的路径。没有PropertyGroup块,我可以看到它在原始项目中被执行以覆盖此项,所以我不确定发生了什么。

我们做了类似的构建.NET CF的核心程序集。 试试这个:

<Target Name="AfterBuild"> 
    <MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" /> 
</Target> 
+0

似乎工作得很好,谢谢。 现在找出类似的C++项目... – PeteVasi 2009-10-20 13:31:04

+2

很好地工作的C + +项目。只是将条件从'x86'改为'Win32' – Woodman 2015-11-19 07:55:35

+0

YMMV,但对我而言,C++项目引用没有重新加载,并且链接相关目标的静态库没有重新运行,因此链接被破坏。唉,我想我会回到相当于双“msbuild”的电话。 – crazysim 2016-08-04 00:53:07

你不能用Visual Studio的UI来做到这一点。为此,您需要破解MSBuild文件。

Try this link from MSDN for MSBuild Overview

+0

是的,我一直在用的MSBuild文件工作(手动编辑.csproj的*反正)。我仍然无法实现它的工作。 – PeteVasi 2009-10-15 19:17:00

我想这样做的最好的办法是通过命令行调用的MSBuild。它不应该需要的MSBuild的文件编辑,只需运行

msbuild myproj.sln /p:Configuration="Debug|Win32" 
msbuild myproj.sln /p:Configuration="Debug|x64" 

我认为,如果一个开发人员使用Visual Studio那么他们将只生成的dll,使他们能够与他们进行调试,而且你有一个单独的构建过程,如果你真的部署dll?

+0

是的,在部署可以处理我们需要的任何命令行优点和包装的DLL时,存在单独的构建过程。但是我希望运行Visual Studio的开发人员机器能够轻松地点击“Build”,然后能够测试x86和x64插件。 (也有一点相关,不是解决方案中的所有内容都需要x64版本,配置应用程序只能保持32位。) – PeteVasi 2009-10-15 21:39:24

+0

对于那个特殊的用例,我想不出任何其他的方式来设置自定义构建调用msbuild来构建其他体系结构的规则。 – 2009-10-16 12:06:35

+0

我一直在玩各种自定义构建规则,试图让这个工作,但还没有完全得到。我修改了我的原始问题以包括我所有的尝试。 – PeteVasi 2009-10-16 14:41:04

对于C++,如果它是一个项目,其文件/设置不经常改变的,这样做的一个方法是在解决方案中创建两个项目,这两个项目是指相同的源文件。然后,在x64版本中,将一个项目设置为构建64位和另一个32位。 (在x86版本中,将其中一个设置为32位并关闭另一个。)

我们一直在使用它一段时间,它工作正常。

当然,你必须小心,你所做的任何更改也是对其副本进行的。即如果您添加/删除文件或更改其构建设置,则必须在两个位置执行此操作。源代码更改仍然只需要执行一次,因为每个源文件仍然只有一个副本。

而且,当然,您可能会认为这样做比切换使用IDE更复杂/更危险。尽管如此,在我们的案例中它确实运作良好。

我遇到了一个运行在VS2008 XP(32位)和VS2010 7(64位)项目的问题。我使用的解决方案是使用$(PROGRAMFILES)变量。它在两台机器上正确解析。

导入项目是这样的方式对我的作品在Visual Studio 2010:

TestProject64.vcxproj

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="TestProject.vcxproj" /> 
    <ItemGroup Label="ProjectConfigurations"> 
    <ProjectConfiguration Include="Release|x64"> 
     <Configuration>Release</Configuration> 
     <Platform>x64</Platform> 
    </ProjectConfiguration> 
    </ItemGroup> 
    <PropertyGroup Label="Globals"> 
    <ProjectGuid>{B7D61F1C-B413-4768-8BDB-31FD464AD053}</ProjectGuid> 
    </PropertyGroup> 
</Project> 

TestProject64.vcxproj.filters

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="TestProject.vcxproj.filters" /> 
</Project> 

TestProject.vcxproj有两种配置定义内部:发布| x86和发行版| x64。正如你所看到的,TestProject64.vcxproj只有Release | x64配置。在TestProject64.vcxproj中定义至少一个配置是必要的,否则Visual Studio将无法将TestProject64.vcxproj添加到解决方案中。

现在可以将TestProject.vcxproj和TestProject64.vcxproj包括到同一个解决方案中,并同时构建Release | x86和Release | x64。

也许我错过了这个讨论的要点。使用Visual Studio,转到生成/配置管理器。在主动解决方案平台下拉菜单中,选择“新...”,出现一个新的解决方案平台对话框。选择x64并接受默认的复制来源。关闭对话框和配置管理器。现在打开Build/Batch Build。检查你想要构建和配置的配置。你会发现独立于Win32 exec的x64构建可执行文件。您可以通过右键单击执行程序并选择“属性”来确认这些是预期的,选择“兼容性”选项卡。在下拉窗口中,您可以查看可以运行exec的操作系统。显然,可能需要进行一些其他调整,以便将所有输出文件放在适当的位置,但此方法似乎比简单与上面描述的构建相比,构建起来更加虚幻。

我建议创建一个虚拟C++生成文件项目,然后从它调用的MSBuild两次:

msbuild myproj.sln /p:Configuration="Debug|Win32" 

msbuild myproj.sln /p:Configuration="Debug|x64"