Sobes.tech
Junior

Кадом намуд китобхонаҳоро мешиносед ва фарқиятҳои онҳо чӣҳоянд?

sobes.tech AI

Ҷавоб аз AI

Види бібліотек:

  • Статичні бібліотеки (.a у Linux, .lib у Windows): Код бібліотеки безпосередньо вбудовується у виконуваний файл програми під час компіляції. Програма стає більшою, але не залежить від наявності самої бібліотеки в системі під час виконання. Кожна програма, яка використовує статичну бібліотеку, має свою власну копію коду.
  • Динамічні (спільні) бібліотеки (.so у Linux, .dll у Windows): Код бібліотеки завантажується в пам’ять програми під час виконання. Це зменшує розмір виконуваного файлу програми. Кілька програм можуть використовувати одну й ту ж копію бібліотеки, що економить пам’ять. Для коректної роботи програми динамічна бібліотека повинна бути присутня в системі.

Основні відмінності:

Ознака Статична бібліотека Динамічна бібліотека
Розмір програми Більший (код вбудовується) Менший (код завантажується під час виконання)
Залежність Відсутня (код всередині виконуваного файлу) Присутня (бібліотека має бути в системі)
Використання пам’яті Кожна програма має свою копію коду Кілька програм можуть використовувати одну копію
Оновлення коду Вимагає перекомпіляції програми Можна оновити бібліотеку окремо

Приклад використання статичної бібліотеки у C++ (умовний):

// main.cpp
#include "static_library.h" // Заголовочний файл статичної бібліотеки

int main() {
  // Виклик функції з статичної бібліотеки
  static_function();
  return 0;
}

Приклад використання динамічної бібліотеки у C++ (умовний):

// main.cpp
#include <dlfcn.h> // Для функцій завантаження динамічних бібліотек

int main() {
  // Завантаження динамічної бібліотеки
  void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
  if (!handle) {
    // Обробка помилки
  }

  // Отримання адреси функції з бібліотеки
  void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
  if (!dynamic_function) {
    // Обробка помилки
  }

  // Виклик функції
  dynamic_function();

  // Закриття бібліотеки
  dlclose(handle);

  return 0;
}