У меня есть большое решение с более чем 10 проектами, в C ++.
Все решение x64 только, кроме проекта п который нуждается в обоих x64 а также win32 версии (правильная загружается во время выполнения).
проект п зависит от нескольких других проектов для файлов lib: С а также ЧАС которые собраны в библиотеки.
п имеет ссылку на С а также ЧАС вот так:
<ProjectReference Include="..\C\C.vcxproj">
<Project>{....}</Project>
</ProjectReference>
<ProjectReference Include="..\H\H.vcxproj">
<Project>{....}</Project>
</ProjectReference>
Я хочу построить проект п для обеих платформ.
Я решил сделать это из мета-P проект, который призывает п вот так:
<MSBuild Projects="..\P\P.vcxproj" Properties="Platform=Win32"/>
<MSBuild Projects="..\P\P.vcxproj" Properties="Platform=x64"/>
Это позволяет п может быть свободно изменено разработчиками, а затем обе версии создаются одновременно мета-P.
Проблема в том, что когда мета-P вызывает MSBuild на проект п ссылки на С а также ЧАС зависит от среды решения (в которой активная платформа всегда x64).
Когда дело доходит до связывания Win32 п к своему собственному C.lib а также H.lib, вступает в силу конфигурация открытого решения, и студия пытается связать ее с версией x64 и терпит неудачу.
Я временно решил это с помощью Exec задача в мета-P бежать MSBuild.exe прямо на п. Это игнорировало свойства среды Visual Studio.
Что такое правильное решение для правильного чтения платформы?
Правильное решение — добавить недокументированное свойство с именем ShouldUnsetParentConfigurationAndPlatform и установите его ложный.
Единственное правильное место, чтобы положить его, находится в каждом Ссылка на проект элемент в п проект, в противном случае он игнорируется.
Так что в итоге это выглядит так:
<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 выполнить Си ЧАСунаследованные свойства вместо чтения их из среды Solution.
Редактировать: см. Полезную ссылку из комментария:
https://github.com/Microsoft/msbuild/blob/98d38cb/src/XMakeTasks/AssignProjectConfiguration.cs#L198-L218
Я не уверен, что вам нужен Meta-P. На работе у нас была похожая проблема.
В P мы добавили ItemGroup с двумя vcxproj:
<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>