Обнаружение 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 командлет

Другие вопросы по тегам