535

我已经安装了 Visual Studio 2012 Release Preview,看起来还不错,但是现在当我尝试使用 Visual Studio 2010 编译 C++ 项目时,我收到以下错误消息:

LINK:致命错误 LNK1123:转换为 COFF 时失败:文件无效或损坏

我不是 100% 确定这一点,但它似乎与其中包含.rc(资源)文件的项目有关。

我尝试通过添加/删除程序修复 Visual Studio 2010 并重新启动,但这没有效果。

如果我在设置为使用 Visual Studio 2010 工具集时使用 Visual Studio 2012 RC 编译 C++ 项目,也会遇到同样的错误。升级到 Visual Studio 2011 工具集可以解决这个问题(但我当然不想为生产代码这样做)。

更新:我已经卸载 Visual Studio 2012,重新启动,问题仍然存在!帮助!

4

26 回答 26

653

这个 MSDN 线程解释了如何修复它。

总结一下:

  • 通过转到禁用增量链接

    Project Properties 
       -> Configuration Properties 
           -> Linker (General) 
              -> Enable Incremental Linking -> "No (/INCREMENTAL:NO)"
    
  • 或安装 VS2010 SP1。

编辑(@CraigRinger):请注意,安装 VS 2010 SP1 将删除 64-bit compilers。您需要安装VS 2010 SP1 编译器包才能将它们取回。

这会影响Microsoft Windows SDK 7.1 for Windows 7 和 .NET 4.0以及Visual Studio 2010

于 2012-06-05T01:19:55.203 回答
252

如果禁用增量链接对您不起作用,并且关闭“嵌入清单”也不起作用,则在您的路径中搜索多个版本的 CVTRES.exe。

通过使用 /VERBOSE 链接器选项进行调试,我发现链接器在尝试调用 cvtres 并且失败时正在写入该错误消息。

事实证明,我的路径中有这个实用程序的两个版本。一个在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cvtres.exe,一个在C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe。VS2012 安装后,VS2010 版本的 cvtres.exe 将不再工作。如果这是您路径中的第一个,并且链接器决定需要将 .res 文件转换为 COFF 对象格式,则链接将失败并显示 LNK1123。

(真的很烦人,错误消息与实际问题无关,但这对于 Microsoft 产品来说并不罕见。)

只需删除/重命名该实用程序的旧版本,或重新排列您的 PATH 变量,以便首先使用该版本。

请注意,对于 x64 工具构建,您可能还需要检查C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64其他cvtres.exe.

于 2013-01-03T18:14:49.463 回答
50

检查版本cvtrs.exe

dir "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe"

错误版本::
date03/18/2010
time:01:16 PM
size:31,048 字节
name:cvtres.exe

正确版本::
date02/21/2011 :06:03
timePM
size:31,056 字节
name:cvtres.exe

如果您有错误的版本,您应该从以下位置复制正确的版本:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe

并在此处替换一个:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

IE

copy "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe" "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe"
于 2013-10-09T11:04:48.383 回答
46

根据 MSDN 论坛中的这个帖子:VS2012 RC 安装破坏 VS2010 C++ 项目,简单来说,cvtres.exe取自VS2010 SP1

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

或来自VS2012

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe

并将其复制到cvtres.exeVS2010 RTM安装中(没有 SP1的那个)

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

这样,您将有效地使用cvtres.exe11.0.51106.1 的更正版本。

对 64 位版本的工具重复相同的步骤C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cvtres.exe

此解决方案是为 VS2010 安装 SP1 的替代方案 - 在某些情况下,您根本无法安装 SP1(即,如果您需要支持 SP1 之前的构建)。

于 2013-03-07T11:46:41.333 回答
36

如果您安装了 Visual Studio 2012 RC,那么它安装了 .NET 4.5 RC。

卸载 .NET 4.5 RC,然后安装您需要的版本(VS 2010 为 4.0)。这应该可以解决您遇到的任何问题。

这解决了同样的问题。无需卸载 Visual Studio。

于 2012-09-04T22:51:50.960 回答
15

这是因为.NET Framework 4.5 正在取代 .NET Framework 4.0。我多次卸载 Visual Studio 2010,但都没有成功。当我删除 .NET Framework 4.5 并重新安装 Visual Studio 2010 时,一切正常。

请参阅完全卸载 Visual Studio 11 以进行全新安装

于 2012-06-18T17:14:57.320 回答
14

对我来说,将“生成清单”设置为“否”修复了它。(也用 /INCREMENTAL:NO 修复)

于 2012-09-06T16:47:43.050 回答
14

如果您使用的是 x64,这里的资源会有所帮助

发生这种情况是因为 Microsoft .NET 4.5 与 Visual C++ 10 不兼容。解决方法是确保您运行 cvtres.exe 的 .NET 版本而不是 Visual C++ 版本。我通过重命名这些文件的 Visual C++ 版本并在其位置复制 .NET 版本来做到这一点。

1. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
2. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cvtres.exe

1. C:\windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
2. C:\windows\Microsoft.NET\Framework64\v4.0.30319\cvtres.exe
于 2015-03-12T13:17:56.127 回答
13

我最终通过完全卸载 VS2012 RC,然后完全卸载 VS2010,然后从头开始重新安装 VS2010 解决了这个问题。

它花了很长时间,但我现在能够再次在 VS2010 中编译 C++ 项目。

于 2012-06-04T23:09:42.893 回答
11

通过删除.NET 4.5 并用.NET 4.0替换它,我神奇地解决了这个问题。然后我不得不修复 Visual Studio 2010 - 它在途中以某种方式损坏。

我以前安装过,然后卸载了 Visual Studio 2012 - 这可能与该问题有关。

于 2012-10-17T20:19:59.063 回答
10

我尚未安装 Visual Studio 2012,但在 Visual Studio 2010 中仍然出现此错误。我在安装 Visual Studio 2010 SP1 后解决了此问题。

于 2012-12-05T14:38:47.603 回答
10

我在使用Microsoft Visual Studio 2010 Ultimate时遇到了同样的问题,并通过此 youtube 视频中描述的方法解决了

该视频建议将C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin中的文件cvtres.exe重命名为cvtres-old.exe (in my Win7X64 matchine)

于 2016-05-14T11:21:18.720 回答
7

在启用增量链接->“否(/INCREMENTAL:NO)”后它对我不起作用,但在我删除 rc 文件后它对我有用。

于 2014-03-28T04:58:59.627 回答
6

+1 给用户简短的答案对我有用!

我尝试对此进行一些调试msbuild /v:diag,并且我看到MSBuild正在尝试将清单嵌入到可执行文件中,在链接器命令行上使用 <somename>.dll.embed.manifest.res,这是一个资源从 <somename>.dll.embed.manifest 构建的文件。但清单文件是一个空的 Unicode 文本文件。(即 Unicode 0xFEFF 前缀的两字节文件)

因此,根本问题似乎与未生成该清单文件有关,或者在应该使用 <somename>.dll.intermediate.manifest 时使用它。

另一种解决方案似乎是关闭属性、清单工具、输入和输出下的“嵌入清单”选项。

于 2012-10-08T22:53:13.857 回答
5

总结一下:

Step1

Project Properties 
   -> Configuration Properties 
       -> Linker (General) 
          -> Enable Incremental Linking -> "No (/INCREMENTAL:NO)"

如果第 1 步不起作用,请执行第 2 步

Project Properties 
   -> Configuration Properties 
       -> Manifest Tool (Input and Output) 
          -> Enable Incremental Linking -> "No"

如果第 2 步不起作用,请执行第 3 步复制文件之一:

  1. C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe
  2. C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\cvtres.exe
  3. C:\Program Files (x86)\Microsoft Visual Studio 13.0\VC\bin\cvtres.exe

    然后,替换为 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe 和我一起做 3 步即可

于 2015-09-30T02:23:34.813 回答
4

截至 2014 年 1 月,由于某些原因我安装了 .NET Framework 4.5.1,我不知道是由于第三方软件安装还是自动更新。

1 月 29 日,我安装了一个组件并开始收到

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 

信息。当时,我通过避免增量链接来解决。

1 月 31 日,我安装了 .NET Framework 4.5.1 的另一个组件,增量链接技巧不再起作用。然后我安装了 Visual Studio 2010 SP1,但后来问题变成了:

Error   6   error LNK1104: cannot open file 'msvcrtd.lib'. 

我认为 SP1 搞砸了我的 Visual Studio 2010 安装。

所以我卸载了 .NET Framework 4.5.1,安装了 .NET Framework 4.0 并卸载然后重新安装了 Visual Studio 2010。这对我有用。

于 2014-02-01T19:54:41.190 回答
3

即使安装了 Service Pack,您也会收到错误消息,然后尝试删除/重命名 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin 文件夹中的 cvtres.exe。这对我有用。

于 2014-11-04T08:29:35.770 回答
1

试了几次,终于通过卸载多次VS2010解决了这个问题。我想我没有卸载所有文件,这就是它第一次不起作用的原因。

在VS2012的安装中,据说如果你有VS2010 SP1,你就不能在两个程序中处理同一个项目。建议只有一个程序。

谢谢!

于 2012-06-13T09:45:34.493 回答
1

我将启用增量链接设置为“否 (/INCREMENTAL:NO)”,但它对我不起作用

接下来我改变了:

Project Properties 
   -> Configuration Properties 
       -> General
          -> Platform Toolset -> "Visual Studio 2012 (v110)"

它对我有用:)

于 2012-10-11T06:06:30.820 回答
1

重新安装 CMake 对我有用。CMake 的新副本发现它应该使用 Visual Studio 11 而不是 10。

于 2013-03-26T20:38:31.550 回答
1

我通过执行以下操作解决了这个问题:

  1. 在命令提示符下,键入 msconfig 并按 Enter。
  2. 单击服务选项卡。
  3. 查找“应用程序体验”并打勾(即选择此选项以启用)。
  4. 单击确定。并在必要时重新启动。

因此,问题将永远存在。一定要随机构建并调试您的 C++ 项目,而不会受到任何干扰。

于 2013-06-12T10:57:46.450 回答
1

我正在使用 Windows SDK 进行核心 Win32 编程,并且出于“未知”原因安装了 .NET 4.5。我已经卸载了它并像以前的答案一样安装了 4.0,是的,它也对我有用。

只是让我大吃一惊,我不得不使用无用的 .NET 框架来使用 SDK 构建 Win32 应用程序。

于 2013-06-19T11:09:20.910 回答
1

对于那些使用 OpenGL SuperBible 6th 源代码示例寻找此问题的解决方案的人,该解决方案是在Release而不是Debug中构建的。所有项目都禁用了Release版本中的增量链接选项。

于 2013-08-08T23:29:42.133 回答
1

我的问题是我的 PC 上有两条包含相同库的路径。两个路径都添加到Configuration Properties -> Linker -> General中的Additional Library Directories中。删除其中一条路径解决了这个问题。

于 2013-10-17T11:20:49.183 回答
1

更新 .NET 后我遇到了同样的问题:我先卸载了 .NET 框架,从visualstudio.com下载了 Visual Studio并选择了“修复”。

NET 框架是使用 Visual Studio 自动安装的 -> 现在可以正常工作了!

于 2015-07-02T20:34:34.993 回答
1

在之前安装了 Visual Studio 2010 的机器上安装了 Visual Studio 2017 和 .NET Framework 4.6 后,我遇到了这个问题。

问题是,在这样的安装之后,来自 C:\Windows\System32 的文件msvcr100_clr0400.dll被新文件覆盖,其大小非常小~19 Kb,而前一个文件约为 800 Kb。

在我从另一台构建机器手动恢复文件后,cvtres.exe 再次开始正常工作。

于 2018-10-11T11:09:32.610 回答