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

StackOverflow https://stackoverflow.com/questions/1411854

Вопрос

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

Это было полезно?

Решение

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

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

dumpbin /headers program.exe

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

Другие советы

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

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

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

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

Я нашел этот метод несколько лет назад благодаря некоторой случайности, и он до сих пор не сработал.

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

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

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

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.

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

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

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

find "FAILIFMISMATCH" xyz.lib

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

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

0@   /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 update 3, его версия компилятора C ++ - 19.00.24215, поэтому в нем было указано / FAILIFMISMATCH: " _MSC_VER = 1900 " в объектном файле.

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

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

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

В управляемом C ++ / CLI был бы эквивалент

Это не подскажет вам истинности компилятор или о том, что IDE, но расскажет вам версию .СЕТЕВЫЕ среды выполнения.Вам может понадобиться знать версию операционной системы, а может и не понадобиться.

-Джесси

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top