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

Но в какой-то момент у нас может быть много разных функций, отправленных во множество файлов, которые нам нужно включить в одну программу, и сложение их всех вместе при компиляции может потребовать много работы (да, мы, программисты, ленивы). Для этого нужны библиотеки. Они содержат объектные файлы, которые представляют собой файлы исходного кода, скомпилированные и скомпилированные, но не связанные (см. Компиляция файлов C с помощью gcc, шаг за шагом). Эти файлы не читаются людьми и имеют расширение .o. Они бывают двух типов: статические и динамические. Сегодня мы поговорим только о статических библиотеках.

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

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

Обычно они заканчиваются расширением «.a» в Unix-подобных системах или «.lib» в Windows.

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

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

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

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

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

Вернемся к нашим статическим библиотекам. Как его создать? Для этого требуется окно терминала, в котором мы можем получить доступ к оболочке (то есть программе, которая напрямую взаимодействует с ядром). Там в командной строке мы будем использовать команду «ar». Согласно странице руководства ar, предоставленной средствами разработки GNU в Unix-подобных системах, «Программа GNU ar создает, изменяет и извлекает из архивов. Архив - это отдельный файл, содержащий набор других файлов в структуре, которая позволяет
извлекать исходные отдельные файлы (называемые членами архива) ».
Как и многие команды, мы можем указать options с помощью команды ar. Например, опция «c» создает библиотеку, если она еще не существует, а опция «r» заменяет старые объектные файлы новыми, которые мы добавляем в библиотеку. Итак, если мы хотим создать статическую библиотеку под названием «mylib», содержащую «file1.o» и «file2.o», мы введем эту команду и нажмем Enter:

Но подождите, как нам создать объектный файл «.o»? Это можно сделать с помощью компилятора, такого как gcc, и опции «-c», которая остановит компиляцию перед этапом связывания, как упоминалось ранее:

Еще кое-что! Нам необходимо проиндексировать статическую библиотеку после ее создания. Это можно сделать двумя способами. Во-первых, мы можем использовать команду «ranlib». Согласно странице руководства, «ranlib генерирует индекс содержимого архива и сохраняет его в архиве. В указателе перечислены все символы, определенные членом архива, который представляет собой перемещаемый объектный файл ». Чтобы использовать его в нашей библиотеке« mylib.a », нам просто нужно ввести:

Другой вариант, который у нас есть, - это добавление опции «s» к нашей команде «ar», что, вероятно, быстрее, поскольку мы можем просто добавить «s» к «rc» и делать все одной командой. Еще одна интересная опция, которую мы можем использовать с «ar», - это «t», которая отображает список файлов, содержащихся в библиотеке.

Другая команда, которая может пригодиться при работе со статическими библиотеками, - «nm». Когда вы набираете «nm libmylib.a», будет отображаться список символов (метаданные об адресах переменных и функций, используемых в программе) из объектных файлов в библиотеке libmylib.a.

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

Теперь, когда библиотека создана, мы можем использовать ее для программы. Предположим, я хочу создать программу под названием «myprog», у которой есть точка входа, также известная как функция main (), в которой выполняются вызовы всех других функций и составляет ядро ​​кода. Функция main () часто записывается в файл main.c.

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

Теперь мы наконец можем связать нашу программу с исполняемым файлом. Это также будет сделано с помощью gcc здесь, используя параметр «-L» с «.» который указывает компоновщику искать статическую библиотеку в текущем каталоге. Мы также будем использовать параметр «-o», за которым следует имя, которое мы хотим дать программе. Если мы не сделаем этот шаг, программа по умолчанию будет называться компилятором «a.out». Вот полная команда:

Нам не нужно было указывать префикс «lib» и суффикс «.a» при связывании библиотеки с командой, потому что компоновщик повторно подключит их для нас, когда мы добавим параметр «-l» и имя библиотеки. сразу после него (здесь «mylib»).

Теперь мы можем, наконец, запустить нашу исполняемую программу, набрав «./myprog» и нажав Enter.

Конечно, есть и другие вещи, которые нужно знать о статических и динамических библиотеках. Но нам нужны только эти простые шаги, чтобы иметь возможность создавать наши собственные статические библиотеки и когда-нибудь выигрывать при создании проектов C. И это уже довольно круто!

Источники: