我有一个大型解决方案,其中包含10个以上的C ++项目。
将全部溶液是64只,除了项目P,其既需要两个64位和win32的版本(在适当的一个在运行时加载)。
项目P依赖于lib文件的其他几个项目:C和H,它们已编译为lib。
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环境属性。
正确读取平台的正确解决方案是什么?
正确的解决方案是添加一个未公开的属性,名为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的继承属性,而不是从Solution环境中读取它们。
编辑:从注释中查看有用的参考:https : //github.com/Microsoft/msbuild/blob/98d38cb/src/XMakeTasks/AssignProjectConfiguration.cs#L198-L218
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句