如何在 Visual Studio 2013 中修复 'error MSB4018: The "VCMessage" task failed unexpectedly'

How to fix 'error MSB4018: The "VCMessage" task failed unexpectedly' in 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 环境迁移的具有相同 project/solution 布局的其他项目没有眨眼,而有些则出现此错误,这会阻止任何类型的成功 compile/build 结果。

修复

错误是由于项目配置字段 Platform Toolset。 (.vcproj 项目文件应在此处列出一个值,例如 v120

之前:

<PlatformToolset>
</PlatformToolset>

之后:

<PlatformToolset>v120</PlatformToolset>

可以通过项目属性面板 > 配置属性 > 常规 > 平台工具集在 DevStudio 中设置此值:: 从那里的下拉列表中选择一个值。


发现方式:

  • 在MSVC2013中创建一个空的new项目

  • 使用 Beyond Compare(或其他视觉差异工具,可以通过复制块轻松编辑正在比较的文件)复制文件集并测试(通过重新加载到 DevStudio 和 运行在其中设置 build 进程)。

  • 下一步复制项目设置的位(如果你的原始项目有多个构建目标,就像我的(Win32/x64/Itanium)一样复制块),再次测试。

  • 冲洗并重复上述步骤,直到您的 'new' 项目出现与旧项目相同的问题。缩小到 .vcproj 文件中的最小 XML 子集。


之前尝试过的相关SO问题和博客:

结论:如果您运行遇到这个问题,请检查您所有的项目配置条目。到了紧要关头,通过上面的比较和测试分而治之的过程来挖掘bug。

在 Visual Studio 2013 年,您在尝试编译在设置不正确的项目中创建的程序时遇到此错误。对我来说,这是在我清理我的安装时发生的。如果你想清除你的临时文件并去 C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\layout 并执行程序 InstallCleanup.exe 它似乎删除了临时文件,但也删除了您的设置。特别是您正在创建的项目类型。

如何重现错误:

如果您执行“新建项目”,它将显示一些选项 1) Atl 2) CLR 3) 常规 4) Win 32。 您必须 select Win 32,然后选择 Win32 控制台或 Win32 项目。默认情况下,它 select 是其他东西,然后在创建项目后你会发现 Properties -> Linker -> System -> Subsystem 是空的,而它应该是 /SUBSYSTEM:CONSOLE(或 /SUBSYSTEM:WIN32)。

修复此问题并尝试编译后会生成 MSB4018 错误。

总之,解决方案是重新创建项目并验证设置是否按照说明正确设置。

我遇到了同样的问题。我的问题是我使用值来输出文件。我使用的是 $(TaskName)$(TaskExt) 而不是 $(TargetName)$(TargetExt)

正确的值可能是

在属性 -> 配置 -> 链接器中

输出文件 = $(SolutionDir)\$(Platform)\$(Configuration)\$(TargetName)$(TargetExt)