stringtranslate.com

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

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

Преимущества и недостатки

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

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

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

Специфическая среда

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

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

Любая функция статической библиотеки может вызывать функцию или процедуру в другой статической библиотеке. Компоновщик и загрузчик обрабатывают это так же, как и для других видов объектных файлов . Файлы статической библиотеки могут быть связаны во время выполнения с помощью загрузчика связей (например, загрузчика модулей 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, которые устанавливаются вместе с определенным приложением и используются только этим приложением.