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

问题描述 投票:33回答:8

我有一个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):错误MSB4006:目标依赖关系图中涉及目标“生成”的循环依赖。

我认为我的条件将阻止无限递归,但我了解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块来覆盖此内容,因此我不确定发生了什么。

visual-studio visual-studio-2008 msbuild 64-bit
8个回答
29
投票

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

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

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。


4
投票

我认为做到这一点的最佳方法是从命令行调用msbuild。它不需要编辑msbuild文件,只需运行

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

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


4
投票

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

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

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

当然,您可能会决定,与退出使用IDE相比,这样做更加复杂/风险更大。不过,在我们的情况下,它确实运行良好。


0
投票

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

Try this link from MSDN for MSBuild Overview


0
投票

也许我错过了这次讨论的重点。使用Visual Studio,转到“构建/配置管理器”。在“活动解决方案平台”下拉列表中,选择“新建...”,出现“新解决方案平台”对话框。选择x64并接受默认的“复制自”。关闭对话框和配置管理器。现在打开Build / Batch Build。检查要构建的那些配置并进行构建。您会发现x64构建可执行文件与Win32 exec分开。您可以通过右键单击exec并选择“属性”,然后选择“兼容性”选项卡来验证这些目标。在下拉窗口中,您可以检查可执行文件可以在哪些操作系统上运行。显然,可能还需要进行一些其他调整才能将所有输出文件放置在正确的位置,但是这种方法似乎比简单一些。比上面描述的还要愚弄。


0
投票

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

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

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

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.