Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Вопрос о совместимости библиотек

#visual_studio #visual_cpp #dll #библиотеки #совместимость


Нужно написать программу, использующую существующие библиотеки. Есть файлы *.dll,
*.lib и *.h соответственно. В документации к библиотеке написано, она была создана
с помощью компилятора Visual C++ 2008. Не знаю, имеет ли значение, вроде как библиотека
используют в т.ч. MFC.

Вопросы:


Что бы эти библиотеки можно было использовать, на компьютере должен быть установлен
Redistributable Package Visual C++ 2008? Или можно более новую версию, без старой?
Правильно ли я полагаю, что библиотеки были созданы в visual studio 2008, т.к. в
документации указан компилятор Visual C++ 2008?
Для написания программы, использующей данные библиотеки, обязательно ли нужно тогда
использовать, соответственно, vs2008? Или можно, скажем студию 2010 или 2017? Нужны
ли тогда дополнительные "телодвижения"? Если "инструкция" большая, где об этом почитать?
Как узнать версию компилятора, в которой была создана библиотека, например, не имея
документации к ней?


Спасибо
    


Ответы

Ответ 1



Как узнать версию компилятора, в которой была создана библиотека, например, не имея документации к ней? Например, выполнить в командной строке Visual Studio команду dumpbin "путь к dll" /imports, найти в ее выводе импорты вида "MSVCR..." или "vcruntime..." и воспользоваться следующей таблицей для определения версии: Visual Studio 2002 MSVCR70.DLL Visual Studio 2003 MSVCR71.DLL Visual Studio 2005 MSVCR80.DLL Visual Studio 2008 MSVCR90.DLL Visual Studio 2010 MSVCR100.DLL Visual Studio 2012 MSVCR110.DLL Visual Studio 2013 MSVCR120.DLL Visual Studio 2015, 2017 vcruntime140.dll Источник: http://matthew-brett.github.io/pydagogue/python_msvc.html Вместо командной строки можно использовать и графические утилиты, например, Dependency Walker. Способ не сработает, если библиотека статически связана с CRT, или не использует CRT вовсе.

Ответ 2



Все зависит от того, как библиотека была построена. Если .dll была собрана со статической линковкой и экспортирует функции как extern "C", то Redistributable Package для нее не требуется, и скорее всего (не проверял, так что неточно) ее можно будет использовать с более новыми версиями студии. Если библиотека была собрана с динамической линковкой, то использовать ее получится только в VS 2008, и для работы ее потребуется либо установленная VS 2008, либо Redistributable Package, причем именно 2008. Компиляторы разных студий по объектному формату несовместимы, причем несовместимым может быть даже тот же самый компилятор после апдейта. Сам влетел в такую ситуацию пару месяцев назад после обновления VS 2017. Пришлось перекомпилировать много чего, включая чужие библиотеки, это было непросто. Теперь от апдейтов как от чумы, хотя VS 2017 кривой до изумления. Правильно ли я полагаю, что библиотеки были созданы в visual studio 2008, т.к. в документации указан компилятор Visual C++ 2008? Необязательно в студии, компилятор и прочее можно пускать и из командной строки. Но в целом да, так и есть. Как узнать версию компилятора, в которой была создана библиотека, например, не имея документации к ней? Версия там есть, потому что компилятор ее проверяет, но где она лежит надо серьезно копать. Проще попробовать собрать с ней что-нибудь и посмотреть что напишет в сообщении об ошибке. Или не напишет. Как-то так. Точно вам разве что в саппорте MS скажут. В целом быстрее будет разобраться экспериментируя.

Ответ 3



1) Это зависит от того, имеются ли в библиотеке специфические вызовы и ресурсы. Сказать однозначно, нужен пакет или нет, невозможно. Нужно запустить и посмотреть. 2) Теоретически, библиотеки могут быть собраны в любом окружении, даже на другой операционной системе. Но обычно, если говорят, что проект/библиотека собираются в VS C++ 2008, то так оно и есть. 3) Степень телодвижений для использования библиотеки зависит от того, как именно эта библиотека реализована. Тут нет общего правила. Хорошим тоном считается сокрытие всей библиотечной магии под сишными интерфейсом. Такой подход позволяет выставить наружу простой интерфейс, который может быть использован различными компиляторами и даже другим языковым окружением. Обычно, при использовании сишного интерфейса значение имеет только разрядность используемого вами компилятора - она должна совпадать с разрядностью компилятора, которым библиотека была собрана. Однако, в мире C++ очень часто бывает так, что в интерфейс библиотеки просачиваются тонкости реализации используемого компилятора. В этом случае библиотеку очень тяжело заставить работать, потому что исключения, шаблоны, искажения имен и вот это все - определяется реализацией и может меняться даже при смене настроек компиляции в одном и том же компиляторе. 4) Версия используемого компилятора вам мало чем поможет. Стандарт C++17 занимает 1700 страниц. Больше половины этого - поведение, определяемое реализацией, то есть - разработчиками компиляторов. Поэтому, если библиотеку не удается подключить к вашему компилятору, при условии, что компилятор имеет подходящую разрядность, то лучше найти другую библиотеку, которая предоставит классический C-интерфейс.

Комментариев нет:

Отправить комментарий