Visual studio 有没有办法确定哪个版本的VisualStudio用于编译静态库?

Visual studio 有没有办法确定哪个版本的VisualStudio用于编译静态库?,visual-studio,static-libraries,static-linking,Visual Studio,Static Libraries,Static Linking,我有一组静态库(.lib)文件,其中一个可能是用不同版本的Visual Studio构建的。这会导致链接到所有项目的项目的代码生成失败。有没有办法确定哪个版本的Visual Studio用于编译静态库?对于发行版库,您不太可能确定版本 对于调试库,您可以使用: 程序集清单应位于转储的开头,并将包含库所需的CRT版本以及用于构建库的编译器的完整路径 对于可执行文件和DLL,您可以使用dumpbin获取链接器版本;它位于“可选标题值”下 也许其他人知道一种获取发布库版本的方法;如果他们感兴趣的话,我

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

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

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

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

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


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

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

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

因此,就像James McNellis的回答一样,这也只适用于调试构建,并且进一步限制为实际使用编译器的构建,该编译器位于路径中带有“Visual Studio”的目录中

多年前,我偶然发现了这种方法,但至今仍未失败


这样做的好处是,如果您熟悉Unix命令行工具,就很容易记住。

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

在托管C++/CLI中会有一个等价的版本

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


-Jesse

如果您有相应的.PDB文件,那么您可以使用类似的工具从那里查看编译器的版本

或者在十六进制查看器中打开PDB并搜索字符串“Microsoft(R)Optimization 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 ........

版本是十六进制13 00, 00,00,6e 5d,00 00,或19.0.23 918.0.< /p>< p>如果静态库是用C++编写的,用MSVC 2010或更新版本构建,则编译器可能会将错误匹配指令提交到目标文件中。

我找不到微软关于失效匹配指令的官方文档,但是链接器似乎用来检测C++标准库版本之间的不兼容性。 可以使用以下命令从静态库打印这些指令:

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"
注意第一条指令:“\u MSC\u VER=NNNN”。根据我的观察,NNNN总是与用于创建对象文件的编译器版本相匹配。在我的例子中,XYZ.LIB是用MSVC 2015更新3创建的,它的C++编译器版本是19.00 .24215,所以它在对象文件中放置了/MulkFiffeMatt:“MyScViver=1900”。
可以找到Visual Studio版本和Microsoft C/C++编译器版本之间的详细映射。

更好的问题是询问编译器的哪个版本。在不使用VisualStudio的情况下编译C++静态LIBs是可能的。在我的特殊情况下,它们都是用某个版本的VisualStudio编译的。还有一个更普遍的问题,一个更好的问题是VisualC++,因为VisualStudio只是一个IDE,这甚至与被问及的问题无关。虽然问题中没有指定语言(鉴于问题,这是正确的),但它讨论的是静态库。静态库意味着本机代码。问题本质上是问,哪个运行时版本被编译成二进制代码。这里对操作系统版本不感兴趣。您可以分享一些有关在哪里可以找到此工具的详细信息吗?如果Visual Studio安装默认不可用,那么我们可以从哪里获得它?dumpbin/headers program.exe-方法不也适用于发布二进制文件吗?我试过了,效果很好。@SUMIT KUMAR SINGH About dumpbin:“您只能从Visual Studio命令提示符启动此工具。您不能从系统命令提示符或文件资源管理器启动它。”from也适用于非调试静态库(.lib)文件。对于VS2017,测试了一些使用v15.9.5和v15.9.6构建的库,它不断报告/故障不匹配:“\u MSC\u VER=1900”,而不是1916(v15.9的四位代码)。在任何情况下,您的答案在许多情况下都是有用的。我知道不鼓励使用“+1”式的评论,但这应该是IMO答案列表中的首要问题,因为它适用于发布库。谢谢
System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;
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 ........
find "FAILIFMISMATCH" xyz.lib
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"