Подтвердить что ты не робот

Есть ли способ определить, какая версия Visual Studio была использована для компиляции статической библиотеки?

У меня есть набор файлов статических библиотек (.lib), один из которых, возможно, был построен с другой версией Visual Studio. Это вызывает генерирование кода проекта, который связывает их всех с ошибкой. Есть ли способ определить, какая версия Visual Studio была использована для компиляции статической библиотеки?

4b9b3361

Ответ 1

Для выпущенных библиотек маловероятно, чтобы вы могли определить версию.

Для библиотек отладки вы можете использовать dumpbin:

dumpbin /rawdata:1 library.lib

Ассемблер сборки должен быть в начале дампа и будет содержать версию CRT, которую требует библиотека, и полный путь к компилятору, используемому для сборки библиотеки.

Для исполняемых файлов и DLL вы можете получить версию компоновщика с помощью dumpbin; в разделе "ДОПОЛНИТЕЛЬНЫЕ ЗНАЧЕНИЯ"

dumpbin /headers program.exe

Возможно, кто-то еще знает, как получить версию для релизов; Я тоже заинтересован, если они есть.

Ответ 2

Я всегда использовал что-то вроде (в окне cygwin):

strings -f *.lib | grep 'Visual Studio'

Компилятор использует путь компилятора в библиотеке при сборке отладки, а местоположение по умолчанию для компилятора Visual Studio находится под контуром, который включает в себя текст "Visual Studio".

Итак, как и ответ Джеймса Макнеллиса, это также работает только для отладочных сборников и дополнительно ограничено сборками, которые фактически используют компилятор, который находится в каталоге с "Visual Studio #" в пути.

Я нашел этот метод несколько лет назад через немного интуитивно, и он еще не сработал.

Это имеет то преимущество, что его легко запомнить, если вы знакомы с инструментами командной строки Unix.

Ответ 3

Если у вас есть соответствующие.PDB файлы, вы можете увидеть версию компилятора оттуда с помощью инструмента, такого как Pdb Inspector.

Или откройте PDB в шестнадцатеричном просмотре и найдите строку "Оптимизация компилятора Microsoft (R)". Версия будет находиться в четырех двухбайтовых шестнадцатеричных значениях непосредственно перед этой строкой, как в этом примере:

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 ........

Таким образом, версия представляет собой HEX 13 00, 00 00, 6E 5D, 00 00 или 19.0.23918.0.

Ответ 4

Если статическая библиотека была написана на С++ и была построена с MSVC 2010 или более новой версией, директива FAILIFMISMATCH могла быть поставлена ​​компилятором в файлы объектов.

Я не могу найти официальный документ от Microsoft о директиве FAILIFMISMATCH, но он, по-видимому, используется компоновщиком для обнаружения несовместимости между версиями стандартной библиотеки С++.

Вы можете использовать следующую команду для печати этих директив из статической библиотеки:

find "FAILIFMISMATCH" xyz.lib

(или используйте способ, который mheyman упомянул, если вы пользуетесь в cygwin или msys)

Результат может быть похож на:

[email protected]   /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"

Обратите внимание на первую директиву: "_MSC_VER = NNNN". В моем наблюдении, NNNN всегда соответствует версии компилятора, используемой для создания объектного файла. В моем случае xyz.lib был создан с обновлением MSVC 2015 версии 3, его версия компилятора С++ - 19.00.24215, поэтому он помещает /FAILIFMISMATCH: "_ MSC_VER = 1900" в объектный файл.

Отображение деталей между версией Visual Studio и версией компилятора Microsoft C/С++ можно найти здесь .

Ответ 5

Вы не указали язык, но в С# ответ за знание ОС и версии .NET(в вашем коде во время выполнения):

System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;

В Managed С++/CLI будет эквивалент

Это не скажет вам версию компилятора или IDE, но сообщит вам о проверке времени выполнения .NET. Вам может потребоваться или не нужно знать версию ОС.

-Jesse