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 для определения платформы по умолчанию:

  1. Откройте файл vcxproj в текстовом редакторе
  2. Добавьте эту строку в PropertyGroup "Globals":

    <Условие платформы = "'$ (Платформа)' == ''">x64

Я не мог добавить комментарий из-за отсутствия повторения, но в том же духе ответа пользователя 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 к решению и сослаться на него, но тогда зачем вам? У вас уже есть проект, в котором они оба включены, и, если вы хотите разные выходы, вы можете легко сделать разные конфигурации.

Другие вопросы по тегам