Динамические библиотеки могут показаться запутанными и ненужными, особенно по сравнению со статическими библиотеками, но на самом деле их довольно просто понять, если вы знаете, что, почему, когда и как.
Что такое динамические библиотеки и почему вы их используете?
Библиотеки — это файлы, содержащие объектные файлы различных программ, которые используются для значительного ускорения компиляции. В C существует два основных типа библиотек: статические и динамические. Статические библиотеки специально вызываются на этапе компоновки компиляции и, как правило, быть больше и медленнее, чем динамические библиотеки. Для получения дополнительной информации о статических библиотеках прочитайте мою предыдущую запись в блоге здесь.
Динамические библиотеки, с другой стороны, не требуют копирования кода. Они не загружаются автоматически при запуске программы, а вместо этого связываются при запуске программы. Это делает их более эффективными и меньшими по размеру, чем статические библиотеки. Динамические библиотеки также известны как общие библиотеки, поскольку код является общим для программ, которые его используют; однако каждая программа поддерживает свой собственный стек и кучу, разделяя все запущенные программы друг от друга.
Когда следует использовать статические и динамические библиотеки?
Статические библиотеки используются, когда наиболее желательны стабильность и время загрузки. У вас остается один большой исполняемый файл, специально и постоянно связанный с вашей программой. Никаких зависимостей не требуется — если вы успешно скомпилировали библиотеку без ошибок линковки, она будет работать бесконечно долго.
Динамические библиотеки используются для обеспечения размера и эффективности. Есть небольшой исполняемый файл, а также несколько файлов библиотеки меньшего размера. Во время выполнения общая библиотека должна быть доступна, и будут возникать ошибки работы или компиляции. Однако разделяемые библиотеки предлагают много преимуществ, в частности, в вашей памяти находится только одна копия кода, что снижает потери памяти и повышает эффективность.
Как создаются динамические библиотеки?
Создание динамических библиотек — это двухэтапный процесс:
- Скомпилируйте соответствующие
.c
файлы в.o
файлов. Для динамических библиотек должен быть включен флаг-fPIC
. Это говорит компилятору генерировать независимые от позиции объектные файлы, которые затем могут быть загружены по любому адресу памяти.
$ gcc -c -fPIC file1.c file2.c file3.c
2. Заархивируйте объектные файлы в общую библиотеку:
$ gcc -shared -o mylibrary.so file1.o file2.o file3.o
Оттуда вы найдете библиотеку с соответствующим названием (обозначаемую суффиксом .so
) в своем каталоге.
Как вы используете динамические библиотеки?
Динамические библиотеки используются двумя способами: динамическое связывание и динамическая загрузка.
Динамическое связывание
Динамическая библиотека может быть связана со следующими флагами gcc:
gcc -L. -l:mylibrary.so
Динамическая загрузка
Динамическая библиотека должна быть открыта и загружена в вашу программу. Это достигается с помощью функции dlopen()
. Для вызова функций используйте функцию dlsym()
. Наконец, динамические библиотеки должны быть выгружены с помощью dlclose()
. Все три эти функции находятся в заголовочном файле dlfcn.h
.