Получение MSBuild для компиляции проекта с зависимостями для платформ Win32 и Win64

У меня есть большое решение с более чем 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.

Что такое правильное решение для правильного чтения платформы?

3

Решение

Правильное решение — добавить недокументированное свойство с именем 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

2

Другие решения

Я не уверен, что вам нужен 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>
0

По вопросам рекламы [email protected]