Статическая библиотека на 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

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

См. также:  Git с Bitbucket

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

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

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

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

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: