Обнаружение MSC_VER библиотеки
У меня есть кодовая база, которую я собираю в библиотеку. Обычно я отправляю библиотеку как MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
но мой клиент просит об этом как MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
,
Я скачал / установил и скомпилировал новые версии моего Lib с Visual Studio 2012. Теперь я хочу проверить lib, чтобы увидеть, какую версию _MSC_VER он использует в настоящее время, чтобы убедиться, что я посылаю им правильную версию.
Как вы узнаете, что _MSC_VER используется в библиотеке?
1 ответ
Возможно, вы сможете попробовать 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"
_MSC_VER
- это макрос, который существует только в файлах LIB или OBJ для определения возможностей связывания, поэтому вы не можете использовать dumpbin PEfile /rawdata | find "_MSC_VER"
для скомпилированных EXE или DLL файлов. В этом случае вам нужно проверить зависимость, запустив
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 и _MSC_VER=1800
. Точно так же VCRUNTIME140 из MSVC++ 14.0, что означает Visual Studio 2015 и_MSC_VER=1900
. Вы можете проверить версию и_MSC_VER
значение здесь
Иногда /rawdata
опция не работает даже с файлами LIB или OBJ. Я перенаправил вывод в файл и увидел, что вывод усечен посередине по неизвестной причине. В/dependents
вариант у них тоже не работает. В этом случае вам нужно использовать другой способ. Если у вас есть инструменты GNU, вы можете запустить любой из следующих
strings OBJ_or_LIB.file | grep -Po '_MSC_VER=\d+'
grep -aPo '_MSC_VER=\d+' OBJ_or_LIB.file
Или вы также можете использовать эту команду PowerShell
sls -CaseSensitive '_MSC_VER=\d+' OBJ_or_LIB.file | foreach {$_.matches} | select value
где sls
это Select-String
командлет