我有一个包含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环境属性。
正确阅读平台的正确解决方案是什么?
答案 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>