В прошлой статье мы объяснили процесс компиляции исходного кода C в исполняемый файл. Мы прошли этапы компиляции и то, как код C предварительно обрабатывается, компилируется в ассемблерный код (.s), ассемблируется в машинный код (.o), затем проходит через компоновщик, где добавляется дополнительный код (.lib .a) и получаем наш исполняемый файл. Теперь в этой статье мы собираемся объяснить, что это за дополнительный код, зачем и как мы его используем. В основном мы собираемся объяснить и понять статические библиотеки.

Что такое библиотеки и что такое статическая библиотека

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

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

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

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

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

Чтобы создать библиотеку, в первую очередь нам нужно, чтобы все наши функции были в отдельных файлах C (function.c). После того, как мы закончим написание-составление-кодирование наших C-файлов, нам нужно будет скомпилировать их в объектные файлы (.o или .obj). Мы делаем это с помощью следующей команды в командной строке оболочки:

gcc -c имя_функции.c
"gcc" означает вызов компилятора
"-c" означает остановку компилятором создания файлов .o
в конец мы даем файл .c, который мы хотим скомпилировать

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

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

На этом этапе мы создали наши файлы .o и готовы создать нашу библиотеку и добавить их. Для этого мы наберем:

ar -rc liball.a *.o
команда «ar» для создания файла архива (.a)
«-r» флаг для замены-перезаписи файлов .o ( если библиотека уже существует)
«-c» флаг для создания библиотеки, если она не существует, или добавляется к ней, если она существует
«liball.a», как мы хотим назвать библиотеку, но всегда с префиксом lib- и расширением .a.
«*.o» для добавления всех объектных файлов (мы можем выбрать один или несколько, введя их имена)

На данный момент мы успешно создали архивный файл, содержащий нужные нам объектные файлы. Это библиотека!!

Чтобы использовать эту библиотеку, мы собираемся скомпилировать наш файл main.c (код для приложения, которое мы хотим создать) и объявить библиотеку нашему компилятору.
Для этого воспользуемся следующей командой:

gcc main.c -L. -lall -o имя_программы
"gcc" для вызова компилятора
"-L." флаг, чтобы указать компилятору искать библиотеки и путь для просмотра
«-lall» с этим флагом мы объявляем имя библиотеки, которую мы хотим связать (обратите внимание, что имя нашей библиотеки liball.a, но мы набрали -lall, компоновщику нужно только знать пользовательское имя, которое мы ему даем, и он автоматически добавит преффикс и расширение)
флаг «-o имя_программы» -o определяет выходное имя исполняемого файла (обратите внимание, что мы могли запустить команду без использования этого флага и получить имя вывода по умолчанию «a.out»)

Я надеюсь, что эта статья помогла вам понять, как создать и использовать статическую библиотеку в C и, в частности, что это такое.