使用单个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>
你不能用Visual Studio的UI来做到这一点。为此,您需要破解MSBuild文件。
是的,我一直在用的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?
是的,在部署可以处理我们需要的任何命令行优点和包装的DLL时,存在单独的构建过程。但是我希望运行Visual Studio的开发人员机器能够轻松地点击“Build”,然后能够测试x86和x64插件。 (也有一点相关,不是解决方案中的所有内容都需要x64版本,配置应用程序只能保持32位。) – PeteVasi 2009-10-15 21:39:24
对于那个特殊的用例,我想不出任何其他的方式来设置自定义构建调用msbuild来构建其他体系结构的规则。 – 2009-10-16 12:06:35
我一直在玩各种自定义构建规则,试图让这个工作,但还没有完全得到。我修改了我的原始问题以包括我所有的尝试。 – 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"
似乎工作得很好,谢谢。 现在找出类似的C++项目... – PeteVasi 2009-10-20 13:31:04
很好地工作的C + +项目。只是将条件从'x86'改为'Win32' – Woodman 2015-11-19 07:55:35
YMMV,但对我而言,C++项目引用没有重新加载,并且链接相关目标的静态库没有重新运行,因此链接被破坏。唉,我想我会回到相当于双“msbuild”的电话。 – crazysim 2016-08-04 00:53:07