Статична бібліотека

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Статична бібліотека (також бібліотека статичного зв'язування) — поняття у інформатиці, що означає бібліотеку підпрограм, яка зв'язується (компонується) з програмою на етапі побудови. Підпрограми таким чином копіюються безпосередньо у двійковий файл програми, що створюється.[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.

Приклади

[ред. | ред. код]

Щоб створити архів 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

Див. також

[ред. | ред. код]

Джерела

[ред. | ред. код]
  1. а б в Static Libraries. TLDP. Архів оригіналу за 3 липня 2013. Процитовано 3 жовтня 2013.
  2. FPC libraries (англ.). Архів оригіналу за 21 лютого 2020. Процитовано 21 лютого 2020. 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. {{cite web}}: Проігноровано |chapter= (довідка)
  3. 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.