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

Что такое динамические библиотеки и почему вы их используете?

Библиотеки — это файлы, содержащие объектные файлы различных программ, которые используются для значительного ускорения компиляции. В C существует два основных типа библиотек: статические и динамические. Статические библиотеки специально вызываются на этапе компоновки компиляции и, как правило, быть больше и медленнее, чем динамические библиотеки. Для получения дополнительной информации о статических библиотеках прочитайте мою предыдущую запись в блоге здесь.

Динамические библиотеки, с другой стороны, не требуют копирования кода. Они не загружаются автоматически при запуске программы, а вместо этого связываются при запуске программы. Это делает их более эффективными и меньшими по размеру, чем статические библиотеки. Динамические библиотеки также известны как общие библиотеки, поскольку код является общим для программ, которые его используют; однако каждая программа поддерживает свой собственный стек и кучу, разделяя все запущенные программы друг от друга.

Когда следует использовать статические и динамические библиотеки?

Статические библиотеки используются, когда наиболее желательны стабильность и время загрузки. У вас остается один большой исполняемый файл, специально и постоянно связанный с вашей программой. Никаких зависимостей не требуется — если вы успешно скомпилировали библиотеку без ошибок линковки, она будет работать бесконечно долго.

Динамические библиотеки используются для обеспечения размера и эффективности. Есть небольшой исполняемый файл, а также несколько файлов библиотеки меньшего размера. Во время выполнения общая библиотека должна быть доступна, и будут возникать ошибки работы или компиляции. Однако разделяемые библиотеки предлагают много преимуществ, в частности, в вашей памяти находится только одна копия кода, что снижает потери памяти и повышает эффективность.

Как создаются динамические библиотеки?

Создание динамических библиотек — это двухэтапный процесс:

  1. Скомпилируйте соответствующие .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.