我有一组静态库(.lib)文件,其中一个文件可能是使用不同版本的Visual Studio构建的。这导致链接所有这些项目的项目的代码生成失败。有没有办法确定使用哪个版本的Visual Studio来编译静态库?

有帮助吗?

解决方案

对于发布库,您不太可能确定版本。

对于调试库,您可以使用 DUMPBIN

dumpbin /rawdata:1 library.lib

程序集清单应该位于转储的开头,并且将包含库所需的CRT版本以及用于构建库的编译器的完整路径。

对于可执行文件和DLL,您可以使用dumpbin获取链接器版本;它在“可选标题值”下

dumpbin /headers program.exe

也许其他人知道获取发布库版本的方法;如果有的话,我当然也很感兴趣。

其他提示

我总是使用类似的东西(在cygwin窗口中):

strings -f *.lib | grep 'Visual Studio'

编译器在调试版本的库中粘贴编译器的路径,Visual Studio的编译器默认位置位于包含文本“Visual Studio”的路径下。

所以,就像James McNellis的回答一样,这也仅适用于调试版本,并且进一步限制为实际使用编译器的构建,该编译器位于路径中的“Visual Studio ”的路径中

几年前我通过一点意外发现了这种方法,但它还没有失败。

如果您熟悉Unix命令行工具,那么它很容易记住。

如果你有相应的.PDB文件,那么你可以使用像 Pdb Inspector

或者在十六进制查看器中打开PDB并搜索字符串“Microsoft(R)Optimizing Compiler”。该版本将在该字符串之前的四个2字节十六进制值中,如下例所示:

000000A060: .. .. .. .. .. .. . ...  .. .. .. .. .. .. 13 00                ..
000000A070: 00 00 6E 5D 00 00 4D 69  63 72 6F 73 6F 66 74 20  ......Microsoft
000000A080: 28 52 29 20 4F 70 74 69  6D 69 7A 69 6E 67 20 43  (R) Optimizing C
000000A090: 6F 6D 70 69 6C 65 72 00  .. .. .. .. .. .. .. ..  ompiler ........

因此版本为HEX 13 00,00 00,6E 5D,00 00或19.0.23918.0。

如果静态库是用C ++编写的,并且是使用MSVC 2010或更新版本构建的,则编译器可能已将FAILIFMISMATCH指令放入目标文件中。

我无法找到Microsoft关于FAILIFMISMATCH指令的官方文档,但链接器似乎使用它来检测C ++标准库版本之间的不兼容性。

您可以使用以下命令从静态库中打印出这些指令:

find "FAILIFMISMATCH" xyz.lib

(或者使用mheyman提到的方式,如果你喜欢cygwin或msys)

结果可能类似于:

0@   /FAILIFMISMATCH:"_MSC_VER=1900" /FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=0" /FAILIFMISMATCH:"RuntimeLibrary=MD_DynamicRelease" /DEFAULTLIB:"msvcprt" /FAILIFMISMATCH:"_CRT_STDIO_ISO_WIDE_SPECIFIERS=0" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"MSVCRT" /DEFAULTLIB:"OLDNAMES"

注意第一个指令:“_ MSC_VER = NNNN”。在我看来,NNNN总是与用于创建目标文件的编译器版本匹配。在我的例子中,xyz.lib是使用MSVC 2015更新3创建的,其C ++编译器版本是19.00.24215,因此它放置/ FAILIFMISMATCH:“_ MSC_VER = 1900”。在目标文件中。

可以找到Visual Studio版本和Microsoft C / C ++编译器版本之间的详细映射在这里

您没有指定语言,但在C#中,了解操作系统和.NET版本(在运行时的代码中)的答案是:

System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;

Managed C ++ / CLI中有一个等价物

这不会告诉您编译器 IDE 的版本,但会告诉您.NET运行时的版本。您可能需要也可能不需要知道操作系统版本。

-Jesse

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top