重装Visual Studio 2010后,重新编译代码,遇到如下错误:
错误“链接:致命错误 LNK1123:转换为 COFF 期间失败:文件无效或损坏”
一个解决方案提到lib文件不兼容,我需要安装Visual Studio 2010 SP1。我这样做了,现在它已经解决了。
我想知道如何检查 lib 文件是否由 SP1 创建?我尝试了 dumpbin,但在结果中找不到版本。
重装Visual Studio 2010后,重新编译代码,遇到如下错误:
错误“链接:致命错误 LNK1123:转换为 COFF 期间失败:文件无效或损坏”
一个解决方案提到lib文件不兼容,我需要安装Visual Studio 2010 SP1。我这样做了,现在它已经解决了。
我想知道如何检查 lib 文件是否由 SP1 创建?我尝试了 dumpbin,但在结果中找不到版本。
这不是与您的 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% 兼容的输出,因此不支持混合它们(至少不在主要版本之间,我不确定此规则如何应用于服务包)。
通常,最好在更新构建系统时重新编译所有库。唯一不会这样做的情况是如果您没有源代码,在这种情况下,您需要非常小心地更新构建系统,以免引入无缘无故的不兼容性。
至于确定准备特定二进制文件的链接器的版本,使用dumpbin.exe(包含在 SDK 中)是完全正确的方法。对于静态库,请从 Visual Studio SDK 命令提示符运行以下命令:
dumpbin /rawdata:1 MyLibrary.lib
您将看到程序集清单,其中包括用于构建库的编译器的完整路径以及它所依赖的 CRT 版本。
对于动态库(即DLL)和可执行文件,运行以下命令:
dumpbin /headers MyApp.exe
在“可选标头值”部分(实际上不是可选的)下查看链接器的版本,以及生成它的时间戳。
请注意,您不太可能在库或二进制文件的发布版本中找到此信息。