我有一组静态库(.lib)文件,其中一个文件可能是使用不同版本的Visual Studio构建的。这导致链接所有这些项目的项目的代码生成失败。有没有办法确定使用哪个版本的Visual Studio来编译静态库?
答案 0 :(得分:25)
对于发布库,您不太可能确定版本。
对于调试库,您可以使用dumpbin:
dumpbin /rawdata:1 library.lib
程序集清单应该位于转储的开头,并且将包含库所需的CRT版本以及用于构建库的编译器的完整路径。
对于可执行文件和DLL,您可以使用dumpbin获取链接器版本;它在“可选的标题值”下
dumpbin /headers program.exe
也许其他人知道获取发布库版本的方法;如果有的话,我当然也很感兴趣。
答案 1 :(得分:8)
我总是使用类似的东西(在cygwin窗口中):
strings -f *.lib | grep 'Visual Studio'
编译器在调试版本的库中粘贴编译器的路径,Visual Studio的编译器默认位置位于包含文本“Visual Studio”的路径下。
所以,就像James McNellis的回答一样,这也适用于调试版本,并且进一步限制为实际使用编译器的构建,该编译器位于路径中的“Visual Studio #”的路径中
我多年前通过一点意外发现了这种方法,但它还没有失败。
如果您熟悉Unix命令行工具,那么它很容易记住。
答案 2 :(得分:5)
如果您有相应的.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。
答案 3 :(得分: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 ++编译器版本之间的详细信息映射at here。
答案 4 :(得分:-3)
您没有指定语言,但在C#中,了解操作系统和.NET版本(在运行时的代码中)的答案是:
System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;
Managed C ++ / CLI中有一个等价物
这不会告诉您编译器或 IDE 的版本,但会告诉您.NET运行时的版本。您可能需要也可能不需要知道操作系统版本。
-Jesse