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

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

Однако то, как на самом деле работают эти шаги, немного отличается для двух библиотек. Приведенные примеры будут показаны с использованием команд для системы Linux. Чтобы создать объектные файлы для статической библиотеки, все необходимые файлы C должны быть скомпилированы с использованием gcc. Например, если в библиотеке должны быть файлы с именами hello.c и bye.c, команда будет выглядеть так:

$ gcc -c hello.c bye.c

Это создаст два новых файла; привет.о и пока.о. После этого файлы необходимо будет создать в реальной библиотеке. Для этого используется команда архиватора (ar). Итак, следующая команда будет такой:

$ ar rcs libhellobye.a hello.o bye.o

Затем будет создан библиотечный файл с именем libhellobye.a, содержащий объектные файлы hello.o и bye.o. Затем библиотека может быть связана с необходимым файлом C при компиляции этой программы. Вот так:

$ gcc -static greet.c -L -lhellobye -o greets

Затем будет создан исполняемый файл с именем «greets», в котором есть копия файла libhellobye.a. Обратите внимание, что при указании имени библиотеки префикс «lib» и суффикс «.a» опущены. Они оба присоединены флагом ‘-l’.

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

$ gcc -c -fPIC hello.c bye.c

Это создаст два объектных файла hello.o и bye.o. Флаг -fPIC, используемый с gcc, создает независимый от позиции код, который можно использовать в общей библиотеке, что позволяет библиотеке быть динамической. Затем следующим шагом будет создание реальной динамической библиотеки. На этот раз снова используется gcc вместо команды ar. Итак, на этот раз команда выглядит так:

$ gcc -shared hello.o bye.o -o libhellobye.so

На этот раз имя библиотеки — libhellobye.so, чтобы показать, что это общая библиотека. Остался единственный шаг — связать его с файлом C и создать исполняемый файл. Команда, используемая для этого, выглядит следующим образом:

$ gcc -L. greet.c -lhellobye -o greets

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