Библиотеки в C — это именно библиотеки. Я знаю, это звучит расплывчато, но нет лучшего способа описать это, по крайней мере, поверхностно. Библиотека в реальном мире — это набор объектов, содержащих информацию. Объекты в физической библиотеке — это книги, тогда как объекты в библиотеке C — это объектные файлы программ, которые скомпилированы в файл, который обычно заканчивается суффиксом «.a» с помощью программы ar. Затем эти файлы можно использовать как единое целое на этапе компоновки программы. Первоначально цель статических библиотек заключалась в том, чтобы сэкономить время компиляции, связывая предварительно скомпилированные программы вместе, а не компилируя их с нуля. С сегодняшними быстрыми компиляторами это не имеет большого значения, но все же есть причины их использовать.

Типы библиотек

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

  • Статическая библиотека. Библиотека, в которой модули связаны с исполняемым файлом перед выполнением. Статические библиотеки обычно называются libname.a. Суффикс .a указывает на архив.
  • Динамическая библиотека. Библиотека, в которой модули могут быть связаны с исполняемой программой во время выполнения. Динамические библиотеки обычно называются libname.so. Суффикс .so указывает на общий объект.

Зачем вам библиотека?

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

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

Как работают библиотеки

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

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

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

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

В результате будет создан файл с именем «example.o», который вы укажете при создании библиотеки с помощью команды ar. Что вы можете сделать, написав это:

ar rcs libproj.a example.o

Предыдущая ода создаст файл библиотеки с именем «libproj.a», который будет содержать «example.o». Флаг r в команде ar говорит ей заменить любые старые файлы самыми последними, если библиотека существует, а флаг c говорит ей создать новую библиотеку, если она еще не существует. Флаг s индексирует библиотеку или обновляет индекс, что вы также можете сделать, используя ranlib, как здесь.

ranlib libproj.a

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

nm libproj.a

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

gcc -L. main.c -lproj -o project

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

  • Исключите префикс lib и суффикс .a, чтобы включить вашу библиотеку

Приведенная выше команда создаст исполняемый файл для main.c и будет использовать любые функции из нашей библиотеки libproj.a. Флаг -L. сообщает компоновщику, что используемая нами библиотека находится в нашем текущем каталоге. Часть -lproj нашей команды на самом деле является названием нашей библиотеки без lib и .a с -l, прикрепленным к ней впереди. Компоновщик добавляет эти части имени библиотеки обратно при поиске файла библиотеки.

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