Я пытаюсь получить чистую сборку x64 для сложной сборки со многими решениями (некоторые для CI, некоторые для разработчиков) и сотнями проектов и столкнулась с ошибкой MSB8013: этот проект не содержит комбинацию конфигурации и платформы отладки | Win32 «
Я сократил его до простой конфигурации:
Ни один из проектов или решений не содержит платформу Win32 — он был удален.
Когда я строю решение B (как x64), я получаю
ошибка MSB8013: этот проект не содержит конфигурацию и
Комбинация платформы Debug | Win32
Сообщение об ошибке иногда содержит дополнительную информацию:
Эта ошибка также может появиться, если какой-то другой проект пытается следовать
от проекта к проекту ссылка на этот проект, этот проект был
выгружен или не включен в решение, а ссылка
проект не строится с использованием той же или эквивалентной конфигурации
или платформа.
Проблема в ссылочном проекте делает «Сборка с использованием той же или эквивалентной конфигурации или платформы.»
Рассматривая диагностику msbuild, проект Y строится, потому что проект X содержит ссылку на проект. Но свойства конфигурации и платформы удаляются непосредственно перед сборкой проекта Y:
1>Task "MSBuild" (TaskId:28)
1> Removing Properties: (TaskId:28)
1> Configuration (TaskId:28)
1> Platform (TaskId:28)
В результате Microsoft.Cpp.Default.props запускается и устанавливает для них Debug | Win32:
1>Task "Message" (TaskId:11)
1> Configuration=Debug (TaskId:11)
1>Done executing task "Message". (TaskId:11)
1>Task "Message" (TaskId:12)
1> Platform=Win32 (TaskId:12)
1>Done executing task "Message". (TaskId:12)
Как я могу предотвратить это и заставить msbuild пройти выбранную конфигурацию & Платформа?
(Я понимаю, что окончательное решение использовать NuGet для управления зависимостями пакетов, но в краткосрочной перспективе это невозможно)
Я мог бы решить аналогичную проблему, включив все упомянутые проекты в решение — в этом случае включая проект Y в решение B.
Одним из исправлений является ручное редактирование файлов .vcxproj для определения платформы по умолчанию:
<Состояние платформы = «‘$ (Платформа)’ == »»>x64</Платформа>
Кажется, это ошибка в Microsoft.CppBuild.targets
файл. На некоторых машинах я вижу два таких файла: один в C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets
размером ~ 120 КБ и C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets
с размером 77 КБ. Второй — глючный и получает неправильное значение $ (Configuration) | $ (Platform), что приводит к указанной ошибке. Эта проблема, вероятно, напрямую связана с Эта тема, поскольку VCTargetsPath в моих проектах указывал на неправильный (77KB) каталог Microsoft.CppBuild.targets (я использую VS2015, поэтому он должен использовать тот из каталога V140). Я нашел два обходных пути: 1) заменить файл с ошибкой или 2) изменить HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\14.0\14.0\VCTargetsPath10
реестр, чтобы указать правильный файл.
Мне трудно понять, чего ты пытаешься достичь с помощью этого. Вы всегда хотите построить X и Y? Даже в решении, которое не имеет отношения к Y? Было бы довольно нелогично для меня. Тем не менее, я могу предложить вам некоторые решения для устранения / подавления этой проблемы, основываясь на том, что вы хотите.
Если вы хотите построить X&Y с A и X с B
В решении A установите другой проект как построить зависимость, вместо ссылки на проект Y в проекте X. Вы не можете установить его, если он ссылается на другой проект (я всегда удаляю ссылку в .vcxproj, она где-то внизу проекта), но как только вы удалили Внутренняя ссылка проекта, вы можете иметь ссылку на решение, и тогда оно должно работать просто отлично.
Когда вы создаете решение A с помощью MSBuild, оно создает X и Y, а решение B — с помощью MSBuild.
еще
Если вы хотите построить X&Y с любым решением
Извините, но в MSBuild сейчас это невозможно. Я бы порекомендовал добавить проект Y к решению и сослаться на него, но тогда зачем вам? У вас уже есть проект, в котором они оба включены, и, если вы хотите разные выходы, вы можете легко сделать разные конфигурации.