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

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

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

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

Создание динамической (разделяемой) библиотеки в Linux

Создание такой библиотеки потребует использования GCC в Linux. Это компилятор C и C++. Первое, что требуется, это включить в вашу библиотеку все файлы C, необходимые для этого.

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o libholberton.so

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

Общий флаг создаст саму библиотеку. После этого флага имя файла нашей библиотеки должно начинаться с «lib» и заканчиваться расширением файла «.so».

Как их можно использовать?

Давайте возьмем образец файла C, чтобы использовать нашу библиотеку. Давайте назовем эту программу «0-main.c». Предположим, что наша библиотека имеет функцию _strlen() и ссылается на наш заголовочный файл «holberton.h»:

#include "holberton.h"
#include <stdio.h>

/**
 * main - check the code for Holberton School students.
 *
 * Return: Always EXIT_SUCCESS.
 */
int main(void)
{
    printf("%d\n", _strlen("Holberton"));
    return (EXIT_SUCCESS);
}

Далее нам нужно будет скомпилировать наш файл C, который будет искать библиотеку в нашем текущем каталоге. А также свяжет наш файл с нашим файлом .so. Мы будем использовать флаги «-L» и «-l»:

gcc -Wall -pedantic -Werror -Wextra -L. 0-main.c -lholberton -o len

Затем нам нужно установить нашу переменную среды в путь к нашей библиотеке с помощью:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

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

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

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

Плюсы и минусы

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

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