重新安装Visual Studio 2010后,我重新编译了代码并遇到以下错误:
错误'LINK:致命错误LNK1123:转换为COFF期间失败:文件无效或损坏'
解决方案提到lib文件不兼容,我需要安装Visual Studio 2010 SP1。我做到了,现在已经解决了。
我想知道如何检查SP1是否创建了lib文件? 我试过dumpbin,但是在结果中找不到版本。
答案 0 :(得分:4)
这与导致此问题的LIB文件不兼容,因此检查创建它的链接器版本无论如何都不是解决方案。
问题是cvtres.exe(由链接器工具链在内部使用)取决于VS 2010 RTM附带的特定DLL(msvcr100_clr0400.dll)。当您更新到更高版本的.NET Framework(例如,通过安装.NET 4.5或安装更高版本的VS)时,将替换此DLL。这会阻止cvtres.exe工作。
安装VS 2010 SP1的原因是修复它是因为它实际修改了cvtres.exe应用程序以破坏依赖关系。现在链接器工具链的所有部分都可以工作,您可以编译并链接代码而不会出错。
当然,当您开始混合由不同版本的编译器和/或链接器创建的库时,可能会遇到其他问题。它们不能保证创建100%兼容的输出,因此不支持混合它们(至少在主要版本之间不支持,我不确定此规则如何应用于服务包)。
通常,每当更新构建系统时,最好只重新编译所有库。你不会这样做的唯一一次是你没有源代码,在这种情况下,你需要非常小心更新你的构建系统,以免引入无偿的不兼容性。 / p>
就确定准备特定二进制文件的链接器版本而言,使用dumpbin.exe(包含在SDK中)是正确的方法。对于静态库,请从Visual Studio SDK命令提示符运行以下命令:
dumpbin /rawdata:1 MyLibrary.lib
您将看到程序集清单,它将包含用于构建库的编译器的完整路径以及它所依赖的CRT的版本。
对于动态库(即,DLL)和可执行文件,请运行以下命令:
dumpbin /headers MyApp.exe
查看链接器版本的“可选标头值”部分(实际上不是可选的),以及生成链接器的时间戳。
请注意,您不太可能在库或二进制文件的发布版本中找到此信息。