Зачем вообще использовать библиотеки

Книжные магазины — это простой и универсальный способ модульности и повторного использования кода.

Как они работают

В этом документе рассматривается процесс создания динамических библиотек. Использование динамических объектов означает оставление связи этих объектов в ожидании в сборке приложения. Когда приложение запущено, и только тогда происходит связь (динамическая привязка) с объектами, содержащимися в библиотеке.

Как их создать (только для Linux)

При создании динамического объекта необходимо, чтобы указанный код объекта не зависел от позиции, для получения такого типа кода компилятору должна быть указана опция -fPIC (Position Independent Code). Этот флаг необходимо указывать как при компиляции, так и при сборке библиотеки.

Мы собираемся скомпилировать все файлы .c, которые нам нужны, таким же образом, чтобы получить файлы .o.

у нас будет такая папка

Так же необходим файл .h куда будут браться все прототипы наших функций, в нашем случае мы назовем его holberton.h

Для монтирования объектов также необходимо указать параметр -shared, чтобы в результате получился «общаемый» объектный файл.

Этот процесс должен дать нам этот результат без ошибок

Чтобы использовать эту библиотеку из программы, вам не нужно делать ничего дополнительно.
При использовании библиотеки компилятор сначала ищет динамическую версию (.so), если не находит, то ищет статическая версия. Если доступны обе версии библиотеки и должна использоваться статическая версия, ассемблеру необходимо указать флаг -static.

Когда программа использует динамические библиотеки, система должна находить их во время выполнения (в отличие от статических библиотек). Места, где программа ищет динамические библиотеки, следующие (в этом порядке):

  • В каталогах переменная LD_LIBRARY_PATH.
  • В файле ld.so.cache.
  • В каталогах /usr/lib и /lib.
  • В каталогах, содержащихся в файле ld.so.conf.

Как правило, наиболее подходящим является использование переменной среды LD_LIBRARY_PATH, чтобы указать, в каких каталогах следует искать:

В чем разница между статическими и динамическими библиотеками

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

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

Каковы преимущества и недостатки каждого из них

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

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