Статична бібліотека
Статична бібліотека (також бібліотека статичного зв'язування) — поняття у інформатиці, що означає бібліотеку підпрограм, яка зв'язується (компонується) з програмою на етапі побудови. Підпрограми таким чином копіюються безпосередньо у двійковий файл програми, що створюється.[1] Програма, побудована таким чином, називається статичною, на противагу динамічній, що потребує компонування з бібліотеками на етапі виконання.
Переваги і недоліки
Основною перевагою статичного зв'язування у порівнянні з динамічним є те, що програма є незалежною від зовнішніх файлів бібліотек. Іншими словами, всі бібліотечні функції вже містяться всередині програми, і їх версії є саме тими, які використовувалися при побудові програми. Таким чином усувається пекло динамічних бібліотек (або іншими словами пекло залежностей), а дистриб'юція і встановлення програми максимально спрощуються.
Недоліком статичного лінкування є суттєве збільшення розмірів файлів, через наявність у них бібліотечних функцій. Втім, це не має значення, якщо програма є повністю незалежною від стандартних бібліотек виконання (наприклад, програма, написана на мові Pascal для Unix-подібних операційних систем, може бути повністю незалежною від стандартних бібліотек мови C[2]).
Особливості у різних ОС
У Microsoft Windows є звичайною практикою включати бібліотечні файли разом з програмою при її розповсюдженні.[3] У Unix-подібних операційних системах такий підхід значно менше розповсюджений, оскільки системи керування пакунками зазвичай можуть відслідкувати залежності і гарантувати, що потрібні розділювані бібліотеки присутні у системі. Динамічний підхід заощаджує місце на диску і дозволяє просте оновлення бібліотек (наприклад, коли у них виявляються уразливості — якби всі програми були зв'язані статично, то для усунення уразливості бібліотечної функції довелося б оновлювати кожну програму окремо).
Компонування і завантаження
Завантаження двійкового файлу програми, що містить бібліотечний код, відбувається стандартними засобами операційної системи (такими, як exec
або spawn
).
Всі виклики підпрограм при статичному компонуванні є простими командами переходу (такими, як call
у архітектурі x86).
Незвичайним застосуванням статичних бібліотек або об'єктних файлів є їх компонування на етапі виконання. Такий підхід використовувався, зокрема, у завантажнику модулів X Window System.[джерело?]
Статичні бібліотеки як набори об'єктних файлів
Створення статичних бібліотек є простим при програмуванні на C або C++. Якщо деяка функція не позначена як static
, вона буде видимою за межами об'єктного файлу, де вона розташовується. Для створення статичної бібліотеки з об'єктних файлів достатньо скористатися програмою ar (або аналогічною у Microsoft Windows чи DOS); отриманий файл матиме суфікс «.a»[1] (англ. archive) або «.lib» у Windows, DOS і OS/2.
Приклади
Unix
Щоб створити архів libclass.a з файлів class1.o, class2.o, class3.o можна запустити таку команду:[1]
ar rcs libclass.a class1.o class2.o class3.o
Для статичного зв'язування програми main з модулями class1.o, class2.o і class3.o, що знаходяться у щойно створеній бібліотеці:
cc main.c libclass.a
або (якщо libclass.a знаходиться у стандартному місці, такому як /usr/local/lib)
cc main.c -lclass
Якщо для лінкування використати безпосередньо програму ld
:
ld ... main.o -lclass ...
Замість статичної бібліотеки можна просто вказати набір об'єктних файлів:
cc main.c class1.o class2.o class3.o
Microsoft Windows
У Windows аналогом програми ar
є LIB
(формат файлів, що генерується цими програмами, не відрізняється). Щоб створити бібліотеку some.lib
з файлів f1.obj
і f2.obj
достатньо виконати команду:
lib /out:some.lib f1.obj f2.obj
Див. також
- Бібліотека підпрограм
- Компонувальник
- Завантажник програм
- Dynamic-link library
- Об'єктний модуль
- Prebinding
Джерела
- Static Libraries. TLDP. Процитовано 3 жовтня 2013.
- Static linking. FPC libraries (англ.). «FPC compiles and links a static executable by default. That means it tells the linker to put all .o files of the project and all packages into one big executable.»
- Anderson, Rick (11 січня 2000). The End of DLL Hell (англ.). microsoft.com. Архів оригіналу за 5 червня 2001. Процитовано 31 серпня 2013. «Private DLLs are DLLs that are installed with a specific application and used only by that application.»