如何检查 LIB 文件版本?

How can I check the LIB file version?

重装Visual Studio2010后,重新编译代码,遇到如下错误:

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

解决方案提到lib文件不兼容,我需要安装Visual Studio 2010 SP1。我做到了,现在已经解决了。

我想知道如何检查 lib 文件是否由 SP1 创建? 我试过 dumpbin,但我在结果中找不到版本。

不是与您的 LIB 文件不兼容导致了这里的问题,因此检查创建它的 linker 的版本无论如何都不是解决方案。

问题是 cvtres.exe(由 linker 工具链内部使用)依赖于 VS 2010 RTM 附带的特定 DLL (msvcr100_clr0400.dll)。当您更新到更高版本的 .NET Framework 时(例如,通过安装 .NET 4.5 或安装更高版本的 VS),此 DLL 将被替换。这会阻止 cvtres.exe 工作。

之所以安装 VS 2010 SP1 修复它是因为它实际上修改了 cvtres.exe 应用程序以打破依赖关系。现在 linker 工具链的所有部分都可以正常工作,您可以编译 link 代码而不会出错。

当然,当您开始混合由不同版本的编译器创建的库 and/or link 时,您可能会遇到 其他 问题。它们不能保证创建 100% 兼容的输出,因此不支持混合它们(至少在主要版本之间不支持,我不确定此规则如何应用于服务包)。

一般来说,每当您更新构建系统时,最好只重新编译所有库。唯一你不会这样做的情况是你没有源代码,在这种情况下,你需要 非常 小心更新你的构建系统,以免引入不必要的不兼容。

就确定准备特定二进制文件的 linker 的版本而言,使用 dumpbin.exe(包含在 SDK 中)是完全正确的方法。对于静态库,运行 Visual Studio SDK 命令提示符中的以下命令:

dumpbin /rawdata:1 MyLibrary.lib

您将看到程序集清单,其中包括用于构建库的编译器的完整路径以及它所依赖的 CRT 版本。

对于动态库(、DLL)和可执行文件,运行以下命令:

dumpbin /headers MyApp.exe

在 "Optional Header Values" 部分(实际上不是可选的)下查看 linker 的版本,以及它生成时的时间戳。

请注意,您不太可能在库或二进制文件的 release 版本中找到此信息。