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

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

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

整个解决方案只有 x64,除了项目 P 需要 x64win32 版本(正确的在运行时加载)。

项目 P 依赖于其他几个项目的 lib 文件:CH,它们被编译成 libs。

P 引用了 CH,如下所示:

<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 时,对 CH 的引用受解决方案环境影响(其中事件平台始终为 x64)。

当谈到将 Win32 P 链接到其适当的 C.libH.lib 时,开放解决方案配置开始, studio 尝试将其与 x64 版本链接,但失败了。

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

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

最佳答案

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

放置它的唯一正确位置是在 P 项目的每个 Project Reference 项中,否则它会被忽略。

所以它最终看起来像这样:

<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 继续使用 CH 的继承属性,而不是从解决方案环境中读取它们。

编辑:从评论中查看有用的引用: https://github.com/Microsoft/msbuild/blob/98d38cb/src/XMakeTasks/AssignProjectConfiguration.cs#L198-L218

关于c++ - 让 MSBuild 编译具有 Win32 和 Win64 平台依赖项的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25137585/

相关文章:

c++ - 将 Python 3 Unicode 转换为 std::string 的简洁方法

c# - MSBuild:构建 DefineConstants 值

c# - 在 Visual Studio App Center for Xamarin iOS : Unsafe code may only appear if compiling with/unsafe 中构建失败

c# - 如何在 C# Socket 上从 android 连续接收位图?

c++ - 光线跟踪平面相交仅绘制部分平面 C++

c++ - 显式选择复制分配

visual-studio-2013 - 无法使用 Web Essentials 在 Visual Studio 中编译有效的 SASS

c++ - VS调试时查找类成员的地址

c++ - 如何在 C/C++ 中使用带有 OpenSSL 的静态链接

batch-file - 批处理文件 - 错误代码