Обнаружение MSC_VER библиотеки

У меня есть кодовая база, которую я компилирую в библиотеку. Обычно я отправляю библиотеку как MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010), но мой клиент запрашивает ее как MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012).

Я загрузил/установил и скомпилировал новые версии своей библиотеки с помощью Visual Studio 2012. Теперь я хочу проверить библиотеку, чтобы узнать, какую версию _MSC_VER она использует в настоящее время, чтобы убедиться, что я отправляю им правильную версию.

Как определить, что _MSC_VER используется в библиотеке?


person Steven Smethurst    schedule 10.12.2013    source источник
comment
Напишите небольшую тестовую программу, которая использует функцию из вашего .lib. Свяжите его с старой версией вашего .lib и убедитесь, что вы получаете ошибку компоновщика, которую получает ваш клиент. Теперь свяжите его со своей новой версией и убедитесь, что у вас нет ошибки компоновщика.   -  person Hans Passant    schedule 11.12.2013
comment
@HansPassant Должен быть инструмент, чтобы определить _MSC_VER библиотеки. Создание приложения, специфичного для моей библиотеки, для обнаружения _MSC_VER кажется мне взломом.   -  person Steven Smethurst    schedule 11.12.2013
comment
Да, этот инструмент называется компоновщиком. Это тот, который генерирует ошибку. Вы можете использовать notepad.exe, если хотите. Найдите FAILIFMISMATCH. Вы найдете их в своем старом .lib   -  person Hans Passant    schedule 11.12.2013


Ответы (2)


Можно попробовать 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"
person msr    schedule 11.05.2015

_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 командлет

person phuclv    schedule 18.03.2020