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

时间:2009-10-15 18:04:28

标签: visual-studio visual-studio-2008 msbuild 64-bit

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

以下是我尝试过测试项目的一些修改,但还没有开始工作:

我已尝试修改<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块在原始项目中执行以覆盖它,所以我不确定发生了什么。

8 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:6)

导入项目在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内部定义了两个配置:Release | x86和Release | x64。如您所见,TestProject64.vcxproj只有Release | x64配置。在TestProject64.vcxproj中定义至少一个配置是必要的,否则Visual Studio将无法将TestProject64.vcxproj添加到解决方案中。

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

答案 2 :(得分:4)

我认为最好的方法是从命令行调用msbuild。它不需要编辑msbuild文件,只需运行

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

我假设如果开发人员正在使用Visual Studio,那么他们只会生成dll以便他们可以使用它们进行调试,并且如果您实际部署了dll,那么您有一个单独的构建过程?

答案 3 :(得分:4)

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

我们已经使用了一段时间,它运行正常。

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

当然,您可能会认为这样做比使用IDE更加复杂/危险。在我们的例子中,它的效果非常好。

答案 4 :(得分:0)

您无法使用Visual Studio的UI执行此操作。为此,您需要破解MSBuild文件。

Try this link from MSDN for MSBuild Overview

答案 5 :(得分:0)

也许我错过了讨论的重点。使用Visual Studio,转到Build / Configuration Manager。在Active Solution Platform下拉列表中,选择&#34; new ...&#34;,将出现一个New Solution Platform对话框。选择x64并接受默认的“复制自”。关闭对话框和配置管理器。现在打开Build / Batch Build。检查要构建的构建并构建它们。您将找到与Win32高管分开的x64构建可执行文件。您可以通过右键单击执行程序并选择“属性”来验证这些是否是预期的,然后选择“兼容性”选项卡。在下拉窗口中,您可以检查exec可以运行的操作系统。显然,您可能需要进行一些其他调整才能将所有输出文件放在适当的位置,但这种方法似乎比愚弄构建而不是上面描述的那些。

答案 6 :(得分:0)

我建议创建一个虚拟C ++ Makefile项目,然后从中调用两次MSBuild:

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

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

答案 7 :(得分:-2)

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