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