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

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

Библиотека — это просто файл, содержащий объектные файлы, с библиотекой мы можем рассматривать эти несколько объектных файлов как отдельные существа, они также индексируются, чтобы ускорить процесс компоновки во время компиляции. Библиотеки полезны, потому что вы можете использовать их функции несколько раз в нескольких программах без необходимости писать их самостоятельно.
Еще одна вещь, на которую следует обратить внимание, это то, что вы не можете запускать библиотеки, потому что они не являются процессами, это те программы, которые выполняют и используют библиотеки.
Существует два типа библиотек. : общие и статические библиотеки, мы сосредоточимся только на статических библиотеках.
Каталог /usr/lib содержит объектные файлы и библиотеки в Linux.

Статические библиотеки

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

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

Как их создать?

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

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

gcc -Wall -pedantic -Werror -Wextra -c *.c

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

Со страницы руководства ar:

ar - создавать, изменять и извлекать из архивов

Для этого примера мы создадим библиотеку с именем libtaco.a. Мы используем команду ar вместе с флагом -r, что означает замену старых объектных файлов новыми и -c. флаг для создания библиотеки, если она еще не существует.

ar -rc libtaco.a *.o

После того, как наш архив создан, нам нужно проиндексировать его с помощью команды ranlib. Мы делаем это, чтобы ускорить процесс связывания, а затем убедиться, что порядок информации не имеет значения при компиляции. Используя ranlib, мы просто обеспечиваем индексацию архива (в некоторых системах команда ar делает это сама).

ranlib libtaco.a

Время использовать их!

Во-первых, просто чтобы просмотреть содержимое нашего архива, мы можем использовать ar -t или команду nm:

ar -t libtaco.a

вывод:

Теперь, если мы хотим использовать нашу библиотеку с программой, мы можем скомпилировать архив вместе с новыми объектными файлами или исходными файлами. Мы можем сделать это, используя -l прямо перед именем нашего архива и опуская lib и расширение .a. Мы также компилируем с флагом -L, который в основном указывает компоновщику во время компиляции ожидать, что библиотека находится в другом месте, чем остальные. -L. означает ожидать наличие библиотеки в текущем каталоге.

Допустим, программе с именем quesadillas.c нужно использовать одну из функций в нашем архиве libtaco.a, а также создать исполняемый файл с именем ужин. Мы можем сделать это, скомпилировав наш исходный файл (quesadilla.c) с нашей статической библиотекой (libtaco.c).

gcc quesadilla.c -L. -ltaco -o dinner

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