Статическая библиотека или статически связанная библиотека содержит функции и данные, которые могут быть включены в потребляющую компьютерную программу во время сборки, так что библиотека не должна быть доступна в отдельном файле во время выполнения. [1] Если все библиотеки статически связаны, то результирующий исполняемый файл будет автономным , то есть статической сборкой .
Статическая библиотека либо объединяется с другими статическими библиотеками и объектными файлами во время сборки для формирования единого исполняемого файла , либо загружается во время выполнения в адресное пространство соответствующего исполняемого файла со статическим смещением памяти, определяемым во время компиляции/компоновки.
Традиционно все библиотечные ссылки были статическими, но сегодня динамическое связывание является альтернативой и влечет за собой определенные компромиссы.
Преимущество статического над динамическим заключается в том, что приложение гарантированно имеет необходимые ему библиотечные процедуры, доступные во время выполнения, поскольку код этих процедур встроен в исполняемый файл. При динамическом связывании файл библиотеки может не только отсутствовать, но даже если он будет найден, это может быть несовместимая версия. Статическое избегает DLL Hell или, в более общем смысле, dependency hell и, следовательно, может упростить разработку, распространение и установку.
Другим компромиссом является память, используемая для загрузки библиотеки. При статической компоновке умный компоновщик включает только тот код, который фактически используется, но для динамической библиотеки вся библиотека загружается в память.
Другим компромиссом является то, что размер исполняемого файла больше при статической компоновке, чем динамической. Но если размер приложения измеряется как сумма исполняемого файла и его динамических библиотек, то общий размер, как правило, меньше для статической. С другой стороны, если одна и та же динамическая библиотека используется несколькими приложениями, то общий размер объединенных приложений и DLL может быть меньше при динамической компоновке.
Распространенной практикой в Windows является установка динамических библиотек программы вместе с файлом программы. [2] В Unix-подобных системах это встречается реже, поскольку системы управления пакетами могут использоваться для обеспечения доступности правильных файлов библиотеки в общем системном расположении. Это позволяет совместно использовать файлы библиотеки между приложениями, что приводит к экономии места. Это также позволяет обновлять библиотеку для исправления ошибок и уязвимостей безопасности без обновления приложений, использующих библиотеку. Но общие динамические библиотеки приводят к риску возникновения проблем с зависимостями.
На практике многие исполняемые файлы используют как статические, так и динамические библиотеки.
Любая функция статической библиотеки может вызывать функцию или процедуру в другой статической библиотеке. Компоновщик и загрузчик обрабатывают это так же, как и для других видов объектных файлов . Файлы статической библиотеки могут быть связаны во время выполнения с помощью загрузчика связей (например, загрузчика модулей X11 ). Однако вопрос о том, можно ли назвать такой процесс статическим связыванием, является спорным.
Статические библиотеки можно легко создать на 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
Частные библиотеки DLL — это библиотеки DLL, которые устанавливаются вместе с определенным приложением и используются только этим приложением.