让MSBuild编译具有Win32和Win64平台依赖项的项目

时间:2014-08-05 11:22:48

标签: c++ msbuild visual-studio-2013 msbuild-task

我有一个包含10多个项目的大型解决方案,使用C ++。

整个解决方案仅 x64 ,项目 P 除外,它同时需要 x64 win32 版本(正确的一个在运行时加载。)

项目 P 取决于lib文件的其他几个项目: C H ,这些项目已编译到库中。

P 引用 C H ,如下所示:

<ProjectReference Include="..\C\C.vcxproj">
   <Project>{....}</Project>
</ProjectReference>
<ProjectReference Include="..\H\H.vcxproj">
   <Project>{....}</Project>
</ProjectReference>

我想为两个平台构建项目 P

我选择从 meta-P 项目中执行此操作,该项目调用 P ,如下所示:

<MSBuild Projects="..\P\P.vcxproj" Properties="Platform=Win32"/>
<MSBuild Projects="..\P\P.vcxproj" Properties="Platform=x64"/>

这允许开发人员自由更改 P ,然后通过构建 meta-P 立即构建两个版本。

问题是当 meta-P 在项目 P 上调用MSBuild时,对 C H 的引用受解决方案环境的影响(活动平台始终为x64)。

在将Win32 P 链接到正确的 C.lib H.lib 时,开放式解决方案配置启动,和studio试图将它与x64版本链接,然后失败。

我暂时使用 meta-P 中的 exec 任务在 P 上直接运行 MsBuild.exe >。这忽略了Visual Studio环境属性。

正确阅读平台的正确解决方案是什么?

2 个答案:

答案 0 :(得分:3)

正确的解决方案是添加一个名为 ShouldUnsetParentConfigurationAndPlatform 的未记录属性,并将其设置为 false

唯一正确的位置是 P 项目中的每个项目参考项目,否则会被忽略。

所以最终看起来像这样:

<ProjectReference Include="..\C\C.vcxproj">
  <Project>{....}</Project>
  <Properties>ShouldUnsetParentConfigurationAndPlatform=false</Properties>
</ProjectReference>
<ProjectReference Include="..\H\H.vcxproj">
  <Project>{....}</Project>
  <Properties>ShouldUnsetParentConfigurationAndPlatform=false</Properties>
</ProjectReference>

这会导致Visual Studio继续使用 C H 的继承属性,而不是从解决方案环境中读取它们。

编辑:请参阅评论的有用参考: https://github.com/Microsoft/msbuild/blob/98d38cb/src/XMakeTasks/AssignProjectConfiguration.cs#L198-L218

答案 1 :(得分:0)

我不确定你是否需要Meta-P。在工作中,我们遇到了类似的问题。

在P中,我们添加了一个带有两个vcxproj的ItemGroup:

<CppProjects Include="...\P64.vcxproj">
  <Properties>Platform=x64</Properties>
</CppProjects>
<CppProjects Include="...\P32.vcxproj">
  <Properties>Platform=Win32</Properties>
</CppProjects>

平台元数据将强制推出预期的平台。

然后在P.csproj中添加一个构建依赖项:

<Target Name="BuildCpp" BeforeTargets="Build">
  <MSBuild Projects="@(CppProjects)" Properties="Configuration=$(Configuration)" RemoveProperties="Platform" />
</Target>