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

  Юрій  | 

  Оновл. 19 Тра 2021  | 

 93

Бібліотека — це «збірник» коду, який можна багаторазово використовувати в різних програмах. Як правило, бібліотека в мові C++ складається з 2-х частин:

   Заголовковий файл, який оголошує функціонал бібліотеки.

   Попередньо скомпільований бінарний файл, який містить реалізацію функціоналу бібліотеки.

Деякі бібліотеки можуть бути розбиті на декілька файлів і/або мати кілька заголовкових файлів.

Типи бібліотек

Бібліотеки попередньо компілюють з кількох причин. По-перше, їх код рідко змінюється. Було б марною тратою часу повторно компілювати бібліотеку кожен раз при її використанні в новій програмі. По-друге, оскільки весь код попередньо скомпільований в машинну мову, то це запобігає отриманню доступу до вихідного коду (і його зміна) сторонніми особами. Цей пункт важливий для підприємств/людей, які не хочуть, щоб результат їх праці (вихідний код) був доступний всім.

Є 2 типи бібліотек: статичні і динамічні.

Статична бібліотека (або «архів») складається з підпрограм, які безпосередньо компілюються і лінкуються з вашою програмою. При компіляції програми, яка використовує статичну бібліотеку, весь функціонал статичної бібліотеки (той, що використовує ваша програма) стає частиною вашого виконуваного файлу. У Windows статичні бібліотеки мають розширення .lib (скор. від «library»), тоді як в Linux статичні бібліотеки мають розширення .a (скор. від «archive»).

Однією з переваг статичних бібліотек є те, що вам потрібно поширити всього лише 1 (виконуваний) файл, щоб користувачі могли запустити і використовувати вашу програму. Оскільки статичні бібліотеки стають частиною вашої програми, то ви можете використовувати їх подібно функціоналу вашої власної програми. З іншого боку, оскільки копія бібліотеки стає частиною кожного вашого файлу, то це може призвести до збільшення розміру файлу. Також, якщо вам потрібно буде оновити статичну бібліотеку, вам доведеться перекомпілювати кожен виконуваний файл, який її використовує.

Динамічна бібліотека (або «загальна бібліотека») складається з підпрограм, які завантажуються в вашу програму під час її виконання. При компіляції програми, яка використовує динамічну бібліотеку, ця бібліотека не стає частиною вашого виконуваного файлу — вона так і залишається окремим модулем. У Windows динамічні бібліотеки мають розширення .dll (скор. від «dynamic link library»), тоді як в Linux динамічні бібліотеки мають розширення .so (скор. від «shared object»). Однією з переваг динамічних бібліотек є те, що різні програми можуть спільно використовувати одну копію динамічної бібліотеки, що значно економить використовуваний простір. Ще однією перевагою динамічної бібліотеки є те, що її можна оновити до новішої версії без необхідності перекомпіляції всіх виконуваних файлів, які її використовують.

Оскільки динамічні бібліотеки не лінкуються безпосередньо з вашою програмою, то ваші програми, які використовують динамічні бібліотеки, повинні явно підключати і взаємодіяти з динамічної бібліотекою. Цей механізм не завжди може бути зрозумілий для новачків, що може затруднити взаємодію з динамічною бібліотекою. Для спрощення цього процесу використовують бібліотеки імпорту.

Бібліотека імпорту (англ. “import library”) — це бібліотека, яка автоматизує процес підключення і використання динамічної бібліотеки. У Windows це зазвичай робиться через невелику статичну бібліотеку (.lib) з тим же ім’ям, що і у динамічної бібліотеки (.dll). Статична бібліотека лінкується з вашою програмою під час компіляції, і тоді функціонал динамічної бібліотеки може ефективно використовуватися у вашій програмі, наче це звичайна статична бібліотека. У Linux загальний об’єктний файл (з розширенням .so) дублюється відразу як динамічна бібліотека та бібліотека імпорту. Більшість лінкерів при створенні динамічної бібліотеки автоматично створюють до неї бібліотеку імпорту.

Установка бібліотек

Тепер, коли ми вже розібралися з типами бібліотек, давайте поговоримо про те, як їх використовувати в наших програмах. Установка бібліотеки в мові C++ складається з 4-х послідовних кроків:

   Крок №1: Отримайте бібліотеку. Найкращим варіантом є знайти вже попередньо скомпільований код (якщо він взагалі існує) під вашу операційну систему, щоб вам не довелося компілювати бібліотеку самостійно. У Windows бібліотеки зазвичай поширюються у вигляді архівів (файлів .zip), а в Linux це пакети коду (наприклад, пакети .rpm).

   Крок №2: Встановіть бібліотеку. У Linux це робиться шляхом виклику менеджера пакетів, а далі він все робить сам. У Windows вам доведеться розпакувати бібліотеку самостійно в будь-яку обрану вами папку. Рекомендується зберігати всі використовувані бібліотеки в одному місці для швидкого доступу до них. Наприклад, створіть папку Libs (C:\Libs) і виділяйте для кожної (використовуваної вами) бібліотеки свою окрему підпапку.

   Крок №3: Переконайтеся, що компілятор знає, де шукати заголовкові файли бібліотеки. У Windows це зазвичай підпапка include всередині основної папки бібліотеки (наприклад, якщо ви встановили бібліотеку в C:\Libs\SDL-1.2.11, то заголовки знаходяться в C:\Libs\SDL-1.2.11\include). У Linux бібліотеки зазвичай встановлюються в /usr/include. Однак, якщо файли знаходяться в іншому місці, вам потрібно буде повідомити компілятор, де саме.

   Крок №4: Повідомте лінкер, де шукати файли з реалізацією функціоналу бібліотеки. Аналогічно з попереднім кроком, вам потрібно вказати лінкеру місце, де знаходяться файли з реалізацією бібліотеки. У Windows це зазвичай підпапка \lib всередині основної папки бібліотеки (C:\Libs\SDL-1.2.11\lib), а в Linux це зазвичай /usr/lib.

Використання бібліотек

Як тільки бібліотека встановлена, і ваша IDE знає, де шукати її файли, то для того, щоб ви могли використовувати цю бібліотеку в ваших проектах, вам необхідно виконати наступні 3 кроки:

   Крок №5: Якщо ви використовуєте статичні бібліотеки або бібліотеки імпорту, повідомте лінкер, які файли бібліотеки потрібно зв’язати з вашою програмою.

   Крок №6: Підключіть заголовкові файли бібліотеки до вашої програми.

   Крок №7: Якщо ви використовуєте динамічні бібліотеки, то переконайтеся, що виконувані файли матимуть доступ до файлів бібліотеки. Найпростіший спосіб використовувати .dll — це скопіювати .dll в папку з виконуваним файлом. Оскільки .dll-ка зазвичай поширюється разом з виконуваним файлом, то це буде не складно.

Висновки

Кроки №3-№5 включають настройку вашої IDE. На щастя, майже всі IDE працюють однаково, коли справа доходить до виконання подібних завдань. На наступному уроці ми розглянемо, як виконати дані кроки в Visual Studio.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (Немає Оцінок)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *