Прежде чем приступить к описанию основных различий между статическими и динамическими библиотеками, давайте сначала определим библиотеку: библиотека — это набор предварительно обработанных функций, хранящихся в формате объектного кода в готовой к использованию форме. Эти библиотеки включаются в начало нашего кода или более известны как заголовочные файлы, например, #include ‹stdio.h›.

Чтобы получить представление о библиотеке в целом, важно понимать каждую часть цикла программы:

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

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

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

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

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

  • .a для статических библиотек.
  • .so для общих библиотек.

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

Выполните следующие шаги, чтобы создать нашу собственную статическую библиотеку:

  1. Создайте файл C или несколько файлов C, содержащих функцию: в этом примере я буду использовать простую функцию _strlen.c, которая возвращает количество символов в строке.

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

3. Скомпилируйте вашу программу или все ваши файлы .c:

Я использую компилятор de C с опцией -c, чтобы не дать компилятору создать полную программу и получить только файл объектного кода («.o»).

4. Используйте команду ar, чтобы взять все созданные объектные файлы и объединить их в один файл с опцией rc.

Создаваемая библиотека называется libholberton.a, параметр r используется для добавления или замены старых файлов, когда это необходимо, а параметр c используется для создать архив.

После создания или изменения архива его необходимо проиндексировать. Позже этот индекс используется компилятором для ускорения поиска символов внутри библиотеки, а команда, используемая для создания или обновления индекса, называется ranlib. Однако в некоторых системах архиватор (не всегда ar) уже позаботится об индексе, поэтому ranlib не нужен.

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

Выполните следующие шаги, чтобы создать нашу собственную динамическую библиотеку:

  1. Как и в статических библиотеках, создайте файл C, содержащий функцию:

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

3. Скомпилируйте файлы .c, чтобы получить объектные файлы для библиотеки:

Как и раньше, я использую флаг -c, чтобы не дать компилятору создать полную программу и получить только файл объектного кода («.o»). Флаг -fPIC означает «Позиционно-независимый код», что означает, что генерирует позиционно-независимый код, это необходимо, потому что код не должен зависеть от того, находится ли он по определенному адресу, чтобы работать с ним во многих программах.

4. Создайте динамическую библиотеку и включите в нее все ранее скомпилированные файлы объектного кода:

Библиотека называлась libholberton.so, и использовался флаг -shared, то есть опция компоновщика, которая создает общий объект, который затем может быть связан с другими объектами для формирования исполняемый.

Кроме того, если вы используете nm -D libholberton.so, вы можете увидеть всю таблицу символов, связанную с каждым объектом.

5. Экспортируйте расположение библиотеки в переменную окружения:

LD_LIBRARY_PATH — это переменная среды пути поиска для общей библиотеки Linux.

Как использовать библиотеки:

Использование обеих библиотек очень похоже:

1. Скомпилируйте свою программу с общей или статической библиотекой:

Флаг -L указывает путь к библиотеке, в данном случае мы просто ставим . (точка), потому что наша библиотека находится в текущем рабочем каталоге.

Обратите внимание: если вы введете ldd, а затем исполняемый файл, вы получите зависимости динамической библиотеки:

7. Запустите вашу программу:

Примечание: вы знаете, как система узнает, где найти каждую библиотеку?
Здесь используется ldconfig. Это создает необходимые ссылки и кеширует самые последние общие библиотеки, найденные в доверенных каталогах.

Различия между статической и динамической библиотекой

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

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

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

Однако в этих библиотеках есть и некоторые недостатки:

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

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

  • Ему нужна только одна копия во время выполнения. Эта возможность делает ее гибкой библиотекой, которую можно использовать в нескольких программах без необходимости иметь собственную копию каждого файла.
  • Если библиотека обновлена, исполняемые файлы не нужно перекомпилировать заново.

Но также хорошо иметь в виду недостатки такого рода библиотек:

  • Это зависит от библиотеки, например, если библиотека будет удалена, исполняемый файл не будет работать.
  • Опять же, если в библиотеке возникает проблема, например, повреждение, исполняемый файл не может работать.

Использованная литература: