Как исправить «ошибку MSB4018: непредвиденный сбой задачи VCMessage» в Visual Studio 2013

Вот что я вижу:

1>------ Build started: Project: xxx (xxx\xxx), Configuration: Debug Win32 ------
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018: The "VCMessage" task failed unexpectedly.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018: System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args)
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at System.String.Format(IFormatProvider provider, String format, Object[] args)
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.Shared.ResourceUtilities.FormatString(String unformatted, Object[] args)
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.Utilities.TaskLoggingHelper.FormatString(String unformatted, Object[] args)
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.Utilities.TaskLoggingHelper.FormatResourceString(String resourceName, Object[] args)
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.Utilities.TaskLoggingHelper.LogErrorWithCodeFromResources(String messageResourceName, Object[] messageArgs)
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.CPPTasks.VCMessage.Execute()
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__20.MoveNext()
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

и решения, перечисленные в поиске Google и SO, не доставляются (удаление завершающих косых черт, возврат к путям $(OutDir) или $(TargetDir) по умолчанию и т. д.)


Контекст

Это касается нескольких проектов, перенесенных с MSVC2012. Другие проекты с таким же макетом проекта/решения, перенесенные из той же среды MSVC2012, не моргнули глазом, в то время как некоторые демонстрируют эту ошибку, которая препятствует любому успешному результату компиляции/сборки.


person Ger Hobbelt    schedule 18.03.2015    source источник


Ответы (3)


Исправление

Ошибка возникла из-за того, что поле конфигурации проекта Platform Toolset было пустым. (В файле проекта .vcproj должно быть указано такое значение, как v120 здесь)

До:

<PlatformToolset>
</PlatformToolset>

После:

<PlatformToolset>v120</PlatformToolset>

Это значение можно установить в DevStudio через панель свойств проекта > Свойства конфигурации > Общие > Набор инструментов платформы: выберите одно из значений из раскрывающегося списка.


Как это было раскрыто:

  • создайте пустой новый проект в MSVC2013 того же типа

  • используйте Beyond Compare (или другой визуальный инструмент сравнения, который может легко редактировать сравниваемые файлы, копируя фрагменты), чтобы скопировать набор файлов и протестировать (перезагрузив в DevStudio и запустив там процесс build).

  • затем скопируйте биты настроек проекта (и продублируйте блоки, если ваш исходный проект имеет несколько целей сборки, как у меня (Win32/x64/Itanium)), снова проверьте.

  • промойте и повторяйте вышеописанное до тех пор, пока ваш «новый» проект не покажет ту же проблему, что и старый. Сократите до минимального подмножества XML в файле .vcproj.


Связанные вопросы SO и блоги, которые были опробованы до всего этого:

Вывод: если вы столкнулись с этой проблемой, проверьте все записи конфигурации вашего проекта. И когда дело доходит до драки, выкопайте жука с помощью описанного выше процесса сравнения и тестирования по принципу «разделяй и властвуй».

person Ger Hobbelt    schedule 18.03.2015
comment
‹PlatformToolset›v120‹/PlatformToolset› следует добавить для каждой конфигурации в этом расположении: ... ‹PropertyGroup Condition='$(Configuration)|$(Platform)'=='XX Label=Configuration› ... ‹PlatformToolset ›v120‹/PlatformToolset› ... ‹/PropertyGroup› ... - person Or b; 08.03.2021

В Visual Studio 2013 вы получаете эту ошибку при попытке скомпилировать программу, созданную в проекте с неверными настройками. Для меня это произошло, когда я очищал свою установку. Если вы пытаетесь очистить свои временные файлы и перейти в C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\layout и запустить программу InstallCleanup.exe, похоже, что временные файлы удаляются, но также и ваши настройки. В частности, тип проекта, который вы создаете.

Как воспроизвести ошибку:

Если вы сделаете «Новый проект», он отобразит некоторые параметры: 1) Atl 2) CLR 3) Общие 4) Win 32. Вы должны выбрать Win 32, а затем выбрать консоль Win32 или проект Win32. По умолчанию он выбирает что-то другое, тогда после создания проекта вы поймете, что Свойства -> Компоновщик -> Система -> Подсистема пуста, когда должно быть /SUBSYSTEM:CONSOLE (или /SUBSYSTEM:WIN32).

После исправления этого и попытки скомпилировать его будет выдана ошибка MSB4018.

Таким образом, решение состоит в том, чтобы снова создать проект и убедиться, что настройки установлены правильно, как описано.

person Gustavo Rodríguez    schedule 15.07.2020

Я была такая же проблема. Моя проблема заключалась в том, что я использовал значения для вывода файла. я использовал $(TaskName)$(TaskExt) вместо $(TargetName)$(TargetExt)

Правильное значение может быть

В Свойствах -> Конфигурация -> Линкер

выходной файл = $(SolutionDir)\$(Platform)\$(Configuration)\$(TargetName)$(TargetExt)

person Saman    schedule 03.02.2021