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

Библиотека программного обеспечения, используемая посредством статической компоновки

Статическая библиотека или статически связанная библиотека содержит функции и данные, которые могут быть включены в потребляющую компьютерную программу во время сборки, так что библиотека не должна быть доступна в отдельном файле во время выполнения. [1] Если все библиотеки статически связаны, то результирующий исполняемый файл будет автономным , то есть статической сборкой .

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

Сравнение с динамическим связыванием

Традиционно все библиотечные ссылки были статическими, но сегодня динамическое связывание является альтернативой и влечет за собой определенные компромиссы.

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

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

Другим компромиссом является то, что размер исполняемого файла больше при статической компоновке, чем динамической. Но если размер приложения измеряется как сумма исполняемого файла и его динамических библиотек, то общий размер, как правило, меньше для статической. С другой стороны, если одна и та же динамическая библиотека используется несколькими приложениями, то общий размер объединенных приложений и DLL может быть меньше при динамической компоновке.

Распространенной практикой в ​​Windows является установка динамических библиотек программы вместе с файлом программы. [2] В Unix-подобных системах это встречается реже, поскольку системы управления пакетами могут использоваться для обеспечения доступности правильных файлов библиотеки в общем системном расположении. Это позволяет совместно использовать файлы библиотеки между приложениями, что приводит к экономии места. Это также позволяет обновлять библиотеку для исправления ошибок и уязвимостей безопасности без обновления приложений, использующих библиотеку. Но общие динамические библиотеки приводят к риску возникновения проблем с зависимостями.

На практике многие исполняемые файлы используют как статические, так и динамические библиотеки.

Связывание и загрузка

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

Создание статических библиотек на C/C++

Статические библиотеки можно легко создать на C или C++ . Эти два языка предоставляют спецификаторы класса хранения для указания внешней или внутренней связи, в дополнение к предоставлению других функций. Чтобы создать такую ​​библиотеку, экспортируемые функции/процедуры и другие переменные объектов должны быть указаны для внешней связи (т. е. не используя staticключевое слово C ). Имена файлов статических библиотек обычно имеют расширение " .a " в Unix-подобных системах [1] и расширение " .lib " в Microsoft Windows .

Например, в Unix-подобной системе для создания архива с именем libclass.a из файлов class1.o , class2.o , class3.o , будет использоваться следующая команда: [1]

ar rcs libclass.a class1.o class2.o class3.o

Чтобы скомпилировать программу, которая зависит от class1.o , class2.o и class3.o , можно сделать следующее:

cc main.c libclass.a

или (если libclass.a находится в стандартном пути к библиотеке, например /usr/local/lib )

cc main.c -lclass

или (во время связывания)

ld ... main.o -lclass ...

вместо:

cc main.c класс1.o класс2.o класс3.o

Смотрите также

Ссылки

  1. ^ abc "Статические библиотеки". TLDP . Получено 3 октября 2013 г.
  2. ^ Андерсон, Рик (11.01.2000). «Конец ада DLL». microsoft.com. Архивировано из оригинала 05.06.2001 . Получено 31.08.2013 . Частные библиотеки DLL — это библиотеки DLL, которые устанавливаются вместе с определенным приложением и используются только этим приложением.
Получено с "https://en.wikipedia.org/w/index.php?title=Static_library&oldid=1273545832"