Статьи

Статическая библиотека на C

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

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

Как работает статическая библиотека:

при компиляции исходного файла вы получаете объектный файл. В зависимости от вашей платформы его расширение может быть .o, .obj или любым другим. Статическая библиотека — это в основном набор объектных файлов, вроде файла .zip, но, вероятно, без сжатия. компоновщик при попытке сгенерировать исполняемый файл пытается разрешить ссылочные символы, т. Е. Определить местонахождение объектного файла (в библиотеке или другом), в котором они определены, и ссылки их вместе. Таким образом, статическая библиотека может также содержать указатель определенных символов, чтобы облегчить это. Точная реализация зависит от конкретного компоновщика и формата файла библиотеки, но базовая архитектура такая, как упоминалось.

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

Чтобы создать статическую библиотеку с использованием GCC, нам нужно скомпилировать код нашей библиотеки в объектный файл, поэтому мы говорим GCC сделать это с помощью -c

$ gcc -c *.c

Здесь, в приведенной выше команде, все файлы с расширением .c (файлы C) в текущем рабочем каталоге были преобразованы в соответствующие объектные файлы. Когда у нас есть объектный файл (ы), мы используем команду GNU ar для создания нашей окончательной библиотеки / архива.

архиватор, также известный как ar, представляет собой Unix утилиту, которая поддерживает группы файлов как один архивный файл.

$ ar -rc libholberton.a *.o

Это указывает ar создать архив (опция c) и вставить объекты, заменяя старые файлы там, где это необходимо (опция r).

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

$ ranlib libholberton.a

Читать:
Определение языка имени человека с помощью PyTorch RNN

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

nm lib_test.a

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

Мы создали статическую библиотеку libholberton.a и теперь позвольте нам использовать статическую библиотеку, вызывая ее как часть процесса компиляции и компоновки при создании исполняемого файла программы. В случае gcc мы используем следующие флаги для создания статической библиотеки

  • -l ‹имя библиотеки без префикса lib и расширения›
  • -L: указывает путь к библиотеке. Можно использовать -L. inorder, чтобы указать на текущий каталог и -L / home / tmp, чтобы указать на каталог / home / tmp.
gcc main.c -L. -lholberton -o main

Теперь запустите исполняемую программу «main».

$./main

Два основных недостатка:

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

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

Похожие записи

Как подготовить компанию и сотрудников к внедрению нейросетей в 2026 году

admin

Глубокий тур по стручкам какао и Карфагену

admin

Найти и вернуть диапазоны всех вхождений данной строки в Swift

admin

То же самое можно сказать и о React: «Поместить HTML в JS — безумие!».

admin

Deepfakes бросит вызов демократии

admin

Языковая модель для НЛП

admin