我有一个静态库(.lib)文件的集合,其中一个可能是用不同版本的Visual Studio构建的。这会导致链接到所有这些链接的项目的代码生成失败。有没有办法确定哪个版本的Visual Studio被用来编译静态库?
发布于 2009-10-09 01:46:43
对于发行库,您不太可能确定版本。
对于调试库,可以使用dumpbin
dumpbin /rawdata:1 library.lib
程序集清单应位于转储的开头,并将包含库所需的CRT版本以及用于生成库的编译器的完整路径。
对于可执行文件和DLL,您可以使用dumpbin获取链接器版本;它位于"OPTIONAL HEADER VALUES“下
dumpbin /headers program.exe
也许其他人知道有一种方法可以获得发行库的版本;如果他们知道,我当然也很感兴趣。
发布于 2016-05-19 16:45:36
如果您有相应的.PDB文件,那么您可以使用Pdb Inspector这样的工具从那里查看编译器的版本。
或者在十六进制查看器中打开PDB并搜索字符串"Microsoft (R) Optimizing“。该版本将包含四个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 ........
因此,版本为十六进制13 00、00 00、6E 5D、00 00或19.0.23918.0。
发布于 2017-09-05 16:23:04
如果静态库是用C++编写的,并且是用MSVC2010或更新版本构建的,则编译器可能已将FAILIFMISMATCH指令放入目标文件中。
我找不到微软关于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是用MSVC2015更新3创建的,它的C++编译器版本是19.00.24215,所以它将/FAILIFMISMATCH:"_MSC_VER=1900“放在目标文件中。
可以在at here中找到Visual Studio版本和Microsoft C/C++编译器版本之间的详细映射。
https://stackoverflow.com/questions/1411854
复制相似问题