Библиотеки способствуют универсальности кода и скорости разработки, о чем я говорил в своем посте о статических библиотеках. Но следует ли использовать статический или динамический? Прежде чем мы сможем ответить на этот вопрос, нам нужно узнать, что такое динамическая или разделяемая библиотека.
В отличие от статических библиотек, программы, использующие динамические библиотеки, не содержат копию библиотеки, поэтому программа и библиотека не связываются во время компиляции. Вместо этого при запуске исполняемого файла, использующего динамическую библиотеку, он должен найти и загрузить эту библиотеку.
Статический и динамический:
- Скорость: для запуска программы, использующей динамическую библиотеку, требуется немного больше времени, потому что компьютер должен искать библиотеку. В статической библиотеке копия библиотеки находится внутри исполняемого файла, поэтому компьютеру не нужно ее искать.
- Хранилище файла/размер исполняемого файла: динамические библиотеки занимают меньше места, поскольку в файловой системе есть только одна копия.
- Простые изменения: изменять программы с помощью динамической библиотеки легко, потому что все программы, зависящие от библиотеки, автоматически отразят это изменение. В статической библиотеке все файлы должны быть перекомпилированы. У этого есть возможный недостаток, заключающийся в том, что можно легко сломать всю программу, внедрив в библиотеку ошибочный код.
- Сложности: использование динамических библиотек может усложниться. См. Ад DLL.
Как создать динамическую библиотеку
Сначала соберите .c
файлы, которые вы хотите в библиотеке, в папку. Включение заголовочного файла с прототипами функций полезно.
Затем скомпилируйте файлы в объектные файлы с помощью команды gcc -Wall -fPIC -c *.c
. gcc
компилирует, а -Wall
включает определенные предупреждения. -fPIC
генерирует независимый от позиции код, необходимый для общих библиотек. -c
говорит компилятору продолжить создание объектных файлов, но остановиться перед их связыванием. Звездочка в *.c
относится ко всем файлам в каталоге, а .c
сужает список до всех файлов с расширением .c
. Это создаст файл .o
для каждого соответствующего файла .c
.
Далее введите команду gcc -shared -Wl,-soname,[library name] -o [library name] *.o
. gcc
компилируется, конечно. -shared
создает общий объект, который затем может быть связан с другими объектами для формирования исполняемого файла. -Wl
передает параметр компоновщику, в данном случае желаемое имя библиотеки. Имена библиотек обычно начинаются с lib
, а динамические библиотеки заканчиваются на .so
. -o
указывает, что библиотека будет иметь следующее имя, [library name]
. Как и *.c
в последней команде, *.o
указывает на все файлы в текущем каталоге с расширением .o
.
Теперь у вас есть библиотека! Для проверки содержимого динамической библиотеки можно использовать те же команды, что и для статической библиотеки.
Один из способов позволить вашему компьютеру легко найти библиотеку — изменить переменную окружения LD_LIBRARY_PATH
, включив в нее текущий каталог. В противном случае программа, использующая библиотеку, не сможет выполниться, поскольку не знает, где находится библиотека. .:[VARIABLE]
— это сокращение для добавления текущего каталога к пути. Для получения дополнительной информации см. этот пост.
Наконец, мы можем проверить, что библиотека работает, написав пример программы и скомпилировав ее с помощью команды gcc -Wall -pedantic -Werror -Wextra -L. [filename] -l[library name] -o [executable name]
. -Wall -pedantic -Werror -Wextra
добавлять предупреждения, помогающие обнаруживать ошибки, но не являющиеся строго необходимыми. -L
добавляет каталог в список каталогов для поиска библиотеки (.
указывает текущий каталог). [filename]
— это .c
пример программы, которую мы написали. Имя библиотеки без lib
и .so
следует после -l
. Еще раз флаг -o указывает желаемое имя исполняемого файла.
Вот как создается динамическая библиотека. Удачного кодирования!
- Все это специфично для Linux.
- Описание опций gcc взято с справочной страницы gcc.