13

这就是我所看到的:

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 环境迁移的具有相同项目/解决方案布局的其他项目没有眨眼,而有些项目出现此错误,这会阻止任何类型的成功编译/构建结果。

4

3 回答 3

22

修复

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

之前

<PlatformToolset>
</PlatformToolset>

之后

<PlatformToolset>v120</PlatformToolset>

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


被发现的方式:

  • 在MSVC2013中新建一个同类型的空项目

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

  • 下一个跨项目设置位的副本(如果您的原始项目有多个构建目标,例如我的(Win32/x64/Itanium),则复制块),再次测试。

  • 冲洗并重复上述操作,直到您的“新”项目出现与旧项目相同的问题。缩小到.vcproj文件中的最小 XML 子集。


在这一切之前尝试过的相关 SO 问题和博客:

结论:如果您遇到此问题,请检查您的所有项目配置条目。当事态发展时,通过上述比较和测试分而治之的过程来挖掘漏洞。

于 2015-03-18T12:14:43.010 回答
1

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

正确的值可能是

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

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

于 2021-02-03T03:59:35.653 回答
0

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

如何重现错误:

如果您执行“新建项目”,它将显示一些选项 1) Atl 2) CLR 3) General 4) Win 32。您必须选择 Win 32,然后选择 Win32 控制台或 Win32 项目。默认情况下,它会选择其他内容,然后在创建项目后,您会发现属性 -> 链接器 -> 系统 -> 子系统应该是 /SUBSYSTEM:CONSOLE(或 /SUBSYSTEM:WIN32)是空的。

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

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

于 2020-07-15T15:27:21.313 回答