我有一组静态库(.lib)文件,其中可能有一个是使用了不同版本的Visual Studio进行编译的。这导致了一个链接了所有静态库的项目的代码生成失败。有没有办法确定哪个版本的Visual Studio被用于编译一个静态库?
我有一组静态库(.lib)文件,其中可能有一个是使用了不同版本的Visual Studio进行编译的。这导致了一个链接了所有静态库的项目的代码生成失败。有没有办法确定哪个版本的Visual Studio被用于编译一个静态库?
对于发布库,你很难确定其版本。
对于调试库,你可以使用dumpbin:
dumpbin /rawdata:1 library.lib
汇编清单应该在转储文件的开头,并包含库所需的 CRT 版本以及用于构建库的编译器的完整路径。
对于可执行文件和 DLL,您可以使用 dumpbin 获取链接器版本;它在“OPTIONAL HEADER VALUES”下面。
dumpbin /headers program.exe
也许还有人知道如何获取发布库的版本号;如果他们知道,我也很感兴趣。
我一直使用类似下面的命令(在cygwin窗口中):
strings -f *.lib | grep 'Visual Studio'
编译器将编译器路径插入调试版本的库中,而Visual Studio的编译器默认位置位于包含文本“Visual Studio”的路径下。
因此,与James McNellis的答案一样,这仅适用于调试版本,并且进一步限制为实际使用路径中带有“Visual Studio #”的编译器的构建。
我多年前通过偶然发现了这种方法,并且迄今为止它从未失败过。
如果您熟悉Unix命令行工具,这样做的好处是易于记忆。
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。
find "FAILIFMISMATCH" xyz.lib
(或者如果您喜欢使用Cygwin或MSYS,则可以使用mheyman提到的方法)
结果可能类似于这样:
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"
您没有指定语言,但在C#中,在运行时了解操作系统和.NET版本(在您的代码中)的答案是:
System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;
在Managed C++/CLI中会有一个等效的版本
这不会告诉您编译器或IDE的版本,但会告诉您.NET运行时的版本。您可能需要知道操作系统的版本。
-Jesse