Статическая библиотека
Эта статья нуждается в дополнительных цитатах для проверки . ( октябрь 2013 г. ) |
В информатике статическая библиотека или статически связанная библиотека — это набор подпрограмм, внешних функций и переменных, которые разрешаются в вызывающей программе во время компиляции и копируются в целевое приложение компилятором , компоновщиком или связующим, создавая объектный файл. и отдельный исполняемый файл . [ 1 ] Этот исполняемый файл и процесс его компиляции известны как статическая сборка программы. Исторически библиотеки могли быть только статическими . Статические библиотеки либо объединяются с другими статическими библиотеками и объектными файлами во время сборки/связывания, чтобы сформировать один исполняемый файл , либо загружаются во время выполнения в адресное пространство соответствующего исполняемого файла со статическим смещением памяти, определяемым во время компиляции/компоновки.
Преимущества и недостатки
[ редактировать ]Есть несколько преимуществ статического связывания библиотек с исполняемым файлом вместо их динамического связывания . Наиболее важным преимуществом является то, что приложение может быть уверено, что все его библиотеки присутствуют и имеют правильную версию. Это позволяет избежать проблем с зависимостями, известных в просторечии как DLL Hell или, в более общем плане, ад зависимостей . Статическая компоновка также позволяет содержать приложение в одном исполняемом файле, что упрощает распространение и установку.
При статическом связывании достаточно включить те части библиотеки, на которые прямо или косвенно ссылается целевой исполняемый файл (или целевая библиотека). При использовании динамических библиотек загружается вся библиотека, так как заранее неизвестно, какие функции будут вызываться приложениями. Будет ли это преимущество существенным на практике, зависит от структуры библиотеки.
При статическом связывании размер исполняемого файла становится больше, чем при динамическом связывании, поскольку код библиотеки хранится внутри исполняемого файла, а не в отдельных файлах. Но если файлы библиотеки считаются частью приложения, общий размер будет таким же или даже меньшим, если компилятор удалит неиспользуемые символы.
Зависит от окружающей среды
[ редактировать ]В Microsoft Windows принято включать в приложение файлы библиотеки, необходимые приложению. [ 2 ] В Unix-подобных системах это встречается реже, поскольку системы управления пакетами для обеспечения доступности правильных файлов библиотеки можно использовать . Это позволяет совместно использовать файлы библиотеки между многими приложениями, что приводит к экономии места. Это также позволяет обновлять библиотеку для исправления ошибок и недостатков безопасности без обновления приложений, использующих библиотеку. На практике многие исполняемые файлы (особенно предназначенные для Microsoft Windows) используют как статические, так и динамические библиотеки.
Связывание и загрузка
[ редактировать ]Любая функция статической библиотеки может вызывать функцию или процедуру из другой статической библиотеки. Компоновщик объектные и загрузчик обрабатывают это так же, как и другие файлы . Файлы статической библиотеки могут быть связаны во время выполнения с помощью связывающего загрузчика (например, загрузчика модуля X11 ). Однако вопрос о том, можно ли такой процесс назвать статическим связыванием, является спорным.
Создание статических библиотек на C/C++
[ редактировать ]Статические библиотеки можно легко создавать на C или C++ . Эти два языка предоставляют спецификаторы классов хранения для указания внешней или внутренней связи, а также предоставляют другие функции. Чтобы создать такую библиотеку, экспортированные функции/процедуры и другие переменные объектов должны быть указаны для внешней компоновки (т. е. не используя C static
ключевое слово ). Имена файлов статических библиотек обычно имеют " Расширение .a " в Unix-подобных системах [ 1 ] и " Расширение .lib » в Microsoft Windows .
Например, в Unix-подобной системе для создания архива с именем libclass.a из файлов класс1.о , класс2.о , class3.o , будет использована следующая команда: [ 1 ]
ar rcs libclass.a class1.o class2.o class3.o
скомпилировать программу, которая зависит от класс1.о , 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 class1.o class2.o class3.o
См. также
[ редактировать ]- Статическая сборка
- Библиотека (вычисления)
- Линкер (вычисления)
- Загрузчик (вычислительный)
- Общая библиотека
- Библиотека динамической компоновки (DLL, .dll)
- Внешняя переменная
- Объектный файл
- Предварительное связывание
- JAR (формат файла)
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с «Статические библиотеки» . ТЛДП . Проверено 3 октября 2013 г.
- ^ Андерсон, Рик (11 января 2000 г.). «Конец ада DLL» . microsoft.com. Архивировано из оригинала 5 июня 2001 г. Проверено 31 августа 2013 г.
Частные библиотеки DLL — это библиотеки DLL, которые устанавливаются вместе с определенным приложением и используются только этим приложением.