Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 检测库的MSC\u VER_Visual Studio_Visual Studio 2012_Static Libraries_Redistributable - Fatal编程技术网

Visual studio 检测库的MSC\u VER

Visual studio 检测库的MSC\u VER,visual-studio,visual-studio-2012,static-libraries,redistributable,Visual Studio,Visual Studio 2012,Static Libraries,Redistributable,我有一个正在编译到库中的代码库。通常我会将库作为MSVC++10.0\u MSC\u VER==1600(Visual Studio 2010)发送,但我的客户要求它作为MSVC++11.0\u MSC\u VER==1700(Visual Studio 2012)发送 我已使用Visual Studio 2012下载/安装并编译了我的库的新版本。现在我想检查lib,查看它当前使用的\u MSC\u VER版本,以确保我向它们发送的是正确的版本 您如何检测库中使用的\u MSC\u VER?您可

我有一个正在编译到库中的代码库。通常我会将库作为
MSVC++10.0\u MSC\u VER==1600(Visual Studio 2010)
发送,但我的客户要求它作为
MSVC++11.0\u MSC\u VER==1700(Visual Studio 2012)
发送

我已使用Visual Studio 2012下载/安装并编译了我的库的新版本。现在我想检查lib,查看它当前使用的
\u MSC\u VER
版本,以确保我向它们发送的是正确的版本


您如何检测库中使用的
\u MSC\u VER

您可以尝试使用dumpbin

c:\dev\tagainijisho>dumpbin C:\Qt\5.4\msvc2010_opengl\lib\qtmaind.lib /rawdata | find "_MSC_VER"
  00000040: 3A 22 5F 4D 53 43 5F 56 45 52 3D 31 36 30 30 22  :"_MSC_VER=1600"

\u MSC\u VER
是一个宏,它只存在于LIB或OBJ文件中,用于确定链接功能,因此对于编译的EXE或DLL文件,不能使用
dumpbin PEfile/rawdata查找“\u MSC\u VER”
。在这种情况下,您需要通过运行

dumpbin /dependents PEfile
在依赖项列表中查找
MSVC*.dll
VCRUNTIME*.dll
。之后的数字是VC可再发行版本

PS C:> dumpbin.exe /dependents C:\qpdf17.dll
[...]
  Image has the following dependencies:

    ADVAPI32.dll
    MSVCP120.dll
    MSVCR120.dll
    KERNEL32.dll

[...]
PS C:> dumpbin.exe /dependents C:\qpdf26.dll
[...]
  Image has the following dependencies:

    ADVAPI32.dll
    MSVCP140.dll
    KERNEL32.dll
    VCRUNTIME140.dll
    VCRUNTIME140_1.dll
[...]
PS C:>
在上面的示例中,MSVCP120来自MSVC++12.0,这意味着Visual Studio 2013和
\u MSC\u VER=1800
。类似地,VCRUNTIME140来自MSVC++14.0,这意味着Visual Studio 2015和
\u MSC\u VER=1900
。您可以检查版本和
\u MSC\u VER


有时,
/rawdata
选项甚至不能用于LIB或OBJ文件。我将输出重定向到文件,并看到输出在中间被截断,原因不明。
/dependents
选项也不适用于他们。在这种情况下,你需要用另一种方法。如果您有GNU工具,那么您可以运行以下任一项

strings OBJ_或_LIB.file | grep-Po'_MSC_VER=\d+'
grep-aPo'\u MSC\u VER=\d+'OBJ\u或\u LIB.file
或者也可以使用此PowerShell命令

sls-区分大小写“\u MSC\u VER=\d+”OBJ_或_LIB.file | foreach{$\u.matches}|选择值

其中,
sls
是使用.lib中的函数编写一个小测试程序。将其与旧版本的.lib链接,并验证您是否获得了客户获得的链接器错误。现在将它与您的新版本链接,并验证您没有收到链接器错误。@HansPassant必须有一个能够检测库版本的工具。制作一个特定于我的lib的应用程序来检测MSC版本对我来说似乎是一种黑客行为。是的,这个工具被称为“linker”。正是它产生了错误。如果确实需要,可以使用notepad.exe。搜索FAILIFMISMATCH。你可以在旧的.lib中找到它们