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;
}