x64 build: ошибка MSB8013: этот проект не содержит комбинацию конфигурации и платформы Debug|Win32
Я пытаюсь получить чистую сборку x64 для сложной сборки со многими решениями (некоторые для CI, некоторые для разработчиков) и сотнями проектов и столкнулась с ошибкой MSB8013: этот проект не содержит комбинацию конфигурации и платформы отладки |Win32"
Я сократил его до простой конфигурации:
- Решение A содержит проект X и проект Y. Проект X имеет ссылку на проект Y.
- Решение B содержит также содержит проект X.
Ни один из проектов или решений не содержит платформу 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 для управления зависимостями пакетов, но в краткосрочной перспективе это невозможно)
4 ответа
Я мог бы решить аналогичную проблему, включив все упомянутые проекты в решение - в этом случае включая проект Y в решение B.
Кажется, это ошибка в 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 в моих проектах указывал на неправильный (77 КБ) каталог Microsoft.CppBuild.targets (я использую VS2015, поэтому он должен использовать тот из каталога V140). Я нашел два обходных пути: 1) заменить файл с ошибкой или 2) изменить HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\14.0\14.0\VCTargetsPath10
реестр, чтобы указать правильный файл.
Одним из исправлений является ручное редактирование файлов.vcxproj для определения платформы по умолчанию:
- Откройте файл vcxproj в текстовом редакторе
- Добавьте эту строку в PropertyGroup "Globals":
<Условие платформы = "'$ (Платформа)' == ''">x64 Platform>
Я не мог добавить комментарий из-за отсутствия повторения, но в том же духе ответа пользователя 1825216 я запускаю MSBuild из командной строки, поэтому я решил эту ошибку, добавив -p:Platform=x64
в команду сборки вместо изменения.vcxproj.
Мне трудно понять, чего ты пытаешься достичь с помощью этого. Вы всегда хотите построить X и Y? Даже в решении, которое не имеет отношения к Y? Было бы довольно нелогично для меня. Тем не менее, я могу предложить вам некоторые решения для устранения / подавления этой проблемы, основываясь на том, что вы хотите.
Если вы хотите построить X&Y с A и X с B
В решении A установите другой проект как зависимость для сборки вместо ссылки на проект Y в проекте X. Вы не можете установить его, если он ссылается на другой проект (я всегда удаляю ссылку в.vcxproj, она где-то есть в нижней части проекта), но как только вы удалите внутреннюю ссылку на проект, у вас может быть ссылка на решение, и тогда она будет работать нормально.
Когда вы создаете решение A с помощью MSBuild, оно создает X и Y, а решение B - с помощью MSBuild.
еще
Если вы хотите построить X&Y с любым решением
Извините, но в MSBuild сейчас это невозможно. Я бы порекомендовал добавить проект Y к решению и сослаться на него, но тогда зачем вам? У вас уже есть проект, в котором они оба включены, и, если вы хотите разные выходы, вы можете легко сделать разные конфигурации.