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

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

почему мы используем статические библиотеки?

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

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

Основным инструментом, используемым для создания статических библиотек, является программа под названием 'ar', что означает «архиватор». Эту программу можно использовать для создания статических библиотек (которые на самом деле являются архивными файлами), изменения объектных файлов в статической библиотеке, перечисления имен объектных файлов в библиотеке и т. д. Чтобы создать статическую библиотеку, мы можем использовать такую ​​команду:

Эта команда создает статическую библиотеку с именем «libutil.a» и помещает в нее копии объектных файлов «util_file.o», «util_net.o» и «util_math.o». Если файл библиотеки уже существует, к нему добавляются или заменяются объектные файлы, если они новее, чем файлы внутри библиотеки. Флаг 'c' указывает ar создать библиотеку, если она еще не существует. Флаг 'r' указывает ему заменить старые объектные файлы в библиотеке новыми объектными файлами.

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

ranlib libutil.a

В некоторых системах архиватор (который не всегда ar) уже заботится об индексе, поэтому ranlib не нужен (например, когда компилятор Sun C создает архив, он уже проиндексирован). Однако, поскольку 'ar' и 'ranlib' используются многими make-файлами для многих пакетов, такие платформы, как правило, предоставляют команду ranlib, которая ничего не делает. Это помогает использовать один и тот же make-файл на обоих типах платформ.

Как мы используем статические библиотеки

мы хотим скомпилировать эту программу C.

Если мы попытаемся скомпилировать программу, мы получим сообщение об ошибке, подобное этому:

Таким образом, компилятор не знает, что такое функция mult(). Нам нужно объяснить программе поиск функции mult() в нашей статической библиотеке, как показано ниже:

Разберем эту команду:

  • -L говорит «ищите в каталоге файлы библиотеки»
  • . (точка после «L») представляет текущий рабочий каталог
  • -l говорит «связать с этим файлом библиотеки»
  • forme — это название нашей библиотеки. Обратите внимание, что мы опустили префикс «lib» и расширение «.a». Компоновщик присоединяет эти части обратно к имени библиотеки, чтобы создать имя файла для поиска.
  • -o my_function говорит «назовите исполняемый файл my_function».

Использование статической библиотеки в программе

После того, как мы создали наш архив, мы хотим использовать его в программе. Это делается путем добавления имени библиотеки в список имен объектных файлов, переданных компоновщику, с использованием специального флага, обычно '-l'. Вот пример:

cc main.o -L. -lutil -o prog

Это создаст программу, используя объектный файл «main.o» и любые необходимые символы из статической библиотеки «util». Обратите внимание, что мы опустили префикс «lib» и суффикс «.a» при упоминании библиотеки в команде ссылки. Компоновщик присоединяет эти части обратно к имени библиотеки, чтобы создать имя файла для поиска. Обратите также внимание на использование флага '-L' — этот флаг сообщает компоновщику, что библиотеки могут быть найдены в заданном каталоге ('.', ссылающемся на текущий каталог), в дополнение к стандартным расположениям, в которых компилятор ищет системные библиотеки.