Есть ли способ определить, какая версия Visual Studio использовалась для компиляции статической библиотеки? - PullRequest
26 голосов
/ 11 сентября 2009

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

Ответы [ 5 ]

25 голосов
/ 09 октября 2009

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

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

dumpbin /rawdata:1 library.lib

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

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

dumpbin /headers program.exe

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

8 голосов
/ 06 июня 2012

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

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

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

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

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

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

5 голосов
/ 19 мая 2016

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

Или откройте PDB в программе просмотра в шестнадцатеричном формате и найдите строку «Оптимизирующий компилятор Microsoft (R)». Версия будет в четырех 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.

0 голосов
/ 05 сентября 2017

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

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

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

find "FAILIFMISMATCH" xyz.lib

(или используйте способ, упомянутый Мейманом, если вы предпочитаете 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 был создан с обновлением 3 MSVC 2015, его версия компилятора C ++ - 19.00.24215, поэтому он поместил / FAILIFMISMATCH: "_ MSC_VER = 1900" в объектный файл.

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

0 голосов
/ 26 июня 2012

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

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

Был бы эквивалент в Managed C ++ / CLI

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

-Jesse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...