Библиотеки
Last updated
Last updated
Термин «библиотека» может иметь несколько значений в зависимости от контекста
Библиотека как файл (library) – файл с скомпилированным кодом (функций, классов, переменных и других сущностей). Библиотеки разделяются на динамические и статические.
Библиотека как набор готового кода – набор файлов библиотек и вспомогательных файлов (заголовочных, ресурсов и пр.). Иногда выступает синонимом "фреймворку" (framework).
Упрощение разработки: не нужно писать код заново, можно использовать готовые решения.
Сокращение времени сборки проекта: код библиотеки уже скомпилирован.
Далее пойдёт описание библиотек как файла. Пример библиотеки как набора готового кода можно посмотреть в разделе .
Статическая библиотека – объектный файл, код из которого выборочно или полностью вставляется в программу на этапе линковки.
Код, подключенный из статической библиотеки, становится частью программы – для использования кода не нужно устанавливать еще какой-либо файл. Линковщик выполняет соединение объектных файлов библиотек и объектных файлов вашей программы во время создания исполняемого файла.
Расширения объектных файлов статических библиотек в разных ОС.
.a
UNIX
.lib
Windows
все необходимые функции включаются в один исполняемый файл.
исполняемый файл занимает больше места на диске и в памяти, если присоединяет код из объектных библиотечных файлов;
при обнаружении ошибок в библиотеке требуется пересборка всех программ, использующих библиотеку.
Динамические библиотеки не является отдельными исполняемыми файлами, а выполняются в контексте вызывающих их программ. ОС загружает динамическую библиотеку в область памяти программы либо при загрузке приложения (неявная компоновка), либо по запросу во время выполнения (явная компоновка).
Расширения имен файлов динамических библиотек в разных ОС.
.so
shared object
Unix
.dll
dynamic link library
Windows
.dylib
dynamic library
MacOS
Импортировать открытые символы в приложение или экспортировать функции из динамической библиотеки можно следующим образом:
Требуется явно специфицировать, что функция/структура будут экспортированы:
Импорт открытых символов и объектов библиотеки:
[Windows stdout]
Прежде чем вызывать подпрограммы, включённые в динамическую библиотеку, их надо импортировать в программу. Возможны следующие варианты:
Статическая линковка.
Загрузка библиотеки при помощи системных вызовов.
После загрузки программы ОС начинает поиск dll:
директория, из которой загружено приложение, требующее dll-библиотеку;
текущая директория;
системные пути;
пути из переменной PATH.
После загрузки запускается сам исполняемый файл.
При динамической компоновке включаются только те сведения, которые позволяют ОС найти и загрузить динамическую библиотеку, содержащую элемент данных или функцию, во время выполнения.
Доступ к подпрограммам динамической библиотеки можно получить при помощи системных вызовов (например, WinAPI: LoadLibrary
, FreeLibrary
и GetProcAddress
).
Рассмотрим следующий пример:
mydll.c
– исходник динамической библиотеки, содержащий 2 функции – одна экспортируется, другая является внутренней для этой библиотеки;
main.c
– исходник программы-таргета, в которой будут использоваться функции из библиотеки;
mydll.dll
– файл динамической библиотеки, собранной из mydll.c
.
Хотя и динамические библиотеки, и приложения являются исполняемыми модулями, они отличаются некоторыми особенностями. Наиболее очевидное – динамическую библиотеку нельзя запустить.
С точки зрения системы, между приложениями и динамическими библиотеками имеется два существенных различия:
В системе может одновременно выполняться несколько экземпляров приложения. Экземпляр динамической библиотеки может быть только один.
Приложение может загружаться как процесс. Ему могут принадлежать такие компоненты, как стек, потоки выполнения, глобальная память, дескрипторы файлов и очередь сообщений. У динамической библиотеки таких компонентов быть не может.
[Windows] После успешной компиляции вы получите файлы .dll
и .lib
. Файл с расширением lib
– библиотека импорта, которая требуется при статическом подключении динамической библиотеки.
экономия памяти и сокращение времени на подкачку за счёт использования одной библиотеки несколькими процессами;
возможность исправления ошибок (достаточно заменить файл библиотеки и перезапустить работающие программы) без изменения кода основной программы;
с помощью явной компоновки можно обнаруживать и загружать динамические библиотеки во время выполнения. Например, это могут быть расширения приложения, которые добавляют новые функциональные возможности без повторной сборки и развертывания приложения;
динамическая компоновка упрощает поддержку приложений, написанных на разных языках программирования, вызывающих одну и ту же функцию в динамической библиотеке при условии соблюдения соглашения о ее вызове.
возможность нарушения API – при внесении изменений в библиотеку существующие программы могут перестать работать, став несовместимыми по интерфейсу;
конфликт версий динамических библиотек – разные программы могут нуждаться в разных версиях библиотеки;
доступность одинаковых функций по одинаковым адресам в разных процессах – упрощает эксплуатацию уязвимостей.
динамическая библиотека – системозависима.
[Windows] DEF-файлы можно использовать для или .
Без найденных на старте dll и нужных импортов программа в принципе не запуститься.
Нужна библиотека импорта на этапе линковки.
позволяет уменьшать требуемое количество памяти;
появляется возможность запускать приложение, даже если какие-то библиотеки отсутствуют.
нужно вручную в коде прописывать загрузку/выгрузку библиотек и поиск нужных функций;
компилятор не может проверить типы и количество передаваемых параметров в загружаемые таким образом функции.