Статические и динамические библиотеки в C

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

По мере того, как программы становятся больше, программисты часто ищут способы более легкого и эффективного управления проектами. Часто это делается посредством создания и использования библиотек. Вообще говоря, библиотека содержит несколько объектных файлов (файлы, оканчивающиеся на .o), которые можно использовать как один элемент или сущность. Это особенно полезно на этапе компоновки компиляции, так как ускоряет процесс. Библиотеки могут использоваться для других программ и другими программистами. Я подробно описал процесс компиляции в предыдущем посте, но диаграмма ниже должна послужить полезным напоминанием.

Кто они такие?

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

Динамические или общие библиотеки подключаются к программе в два этапа. Подобно статическим библиотекам, компоновщик проверяет, все ли необходимое программе скомпоновано в программу или находится в одной из ее разделяемых библиотек. В отличие от статических библиотек, объектные файлы из динамической библиотеки не вставляются в исполняемый файл.

Преимущества недостатки?

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

Как создать статическую библиотеку?

Шаг 1. Создайте объектные файлы из файлов c, которые вы хотите поместить в свой каталог. Для этого при использовании GCC используйте команду «-c». В приведенном ниже примере подстановочный знак «*» используется для сбора всех файлов c в текущем каталоге.

Шаг 2:Теперь, когда у нас есть объектные файлы, которые мы хотим поместить в нашу библиотеку, мы можем создать их с помощью команды архиватора GNU (ar). Эта утилита поддерживает группы в виде файла архива. Параметры «-r» и «-c» используются, чтобы указать компилятору создать файл архива, если он в настоящее время не существует (-c), и заменить старые версии файлов, если это необходимо (-r).

Затем нам нужно предоставить ar имя для нашей библиотеки. Формат статической библиотеки — это префикс lib и суффикс .a. Вэтом примере мы создаем библиотеку с именем lib_my_new_lib.a.

Последняя часть — сообщить компилятору, какие выходные файлы следует включить в библиотеку. В приведенном ниже примере подстановочный знак «*» используется для указания компилятору включить все файлы с расширением «.o».

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

Чтобы просмотреть содержимое вашей библиотеки, просто введите команду ar -t, указав имя библиотеки. Чтобы увидеть символы, которые используются в библиотеке, вы можете использовать команду ‘nm’, за которой следует имя библиотеки.

Как использовать статическую библиотеку?

Теперь, когда библиотека создана и правильно проиндексирована, вы можете использовать ее как часть процесса компиляции для будущих программ. Чтобы сделать это с помощью GCC, вам нужно будет использовать флаги 'l' и '-L'.Флаг 'l' ставится перед именем библиотеки и использоваться вместо префикса и суффикса имени библиотеки. Флаг '-L.' сообщает компоновщику, что библиотека может быть найдена в текущем каталоге в дополнение к традиционным местам, в которых он будет искать библиотеки на компьютере.

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

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

Шаг 1. Чтобы создать динамическую библиотеку, начните с компиляции файлов ‘.c’, которые вы хотите добавить в свою библиотеку, в объектные файлы («.o») с помощью следующей команды:

Шаг 2.Создайте динамическую библиотеку с помощью команды, указанной ниже. Каждая разделяемая библиотека должна иметь специальное имя, называемое soname. Soname должен иметь префикс «lib» и заканчиваться на «.so». Его необходимо скомпилировать с файлами «.o», созданными на предыдущем шаге.

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

Теперь, когда библиотека создана, вы можете использовать ее, скомпилировав ее с флагом «-L» и добавив «l» перед именем библиотеки (пример: для libtestLib.so при компиляции вы должны написать «-ltestLib») аналогично как это делается в статических библиотеках.

Наконец, вы можете добавить переменную среды к пути к библиотеке, который будет найден позже, написав $LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH. После этого ваша программа может быть запущена.