Sobes.tech
Junior

Ce tipuri de biblioteci cunoști și care sunt diferențele dintre ele?

sobes.tech AI

Răspuns de la AI

Tipuri de biblioteci:

  • Biblioteci statice (.a în Linux, .lib în Windows): Codul bibliotecii este integrat direct în fișierul executabil al aplicației în timpul compilării. Aplicația devine mai mare, dar nu depinde de prezența bibliotecii în sistem în timpul rulării. Fiecare aplicație care utilizează o bibliotecă statică are propria copie a codului.
  • Biblioteci dinamice (partajate) (.so în Linux, .dll în Windows): Codul bibliotecii este încărcat în memorie de către aplicație în timpul execuției. Acest lucru reduce dimensiunea fișierului executabil al aplicației. Mai multe aplicații pot folosi aceeași copie a bibliotecii, economisind memorie. Pentru funcționare corectă, biblioteca dinamică trebuie să fie prezentă în sistem.

Principalele diferențe:

Caracteristică Bibliotecă statică Bibliotecă dinamică
Dimensiunea aplicației Mai mare (cod integrat) Mai mică (cod încărcat în timpul execuției)
Dependență Absentă (cod în fișierul executabil) Prezentă (biblioteca trebuie să fie în sistem)
Utilizarea memoriei Fiecare aplicație are propria copie a codului Mai multe aplicații pot folosi aceeași copie
Actualizarea codului Necesită recompilarea aplicației Biblioteca poate fi actualizată separat

Exemplu de utilizare a unei biblioteci statice în C++ (condițional):

// main.cpp
#include "static_library.h" // Fișier antet al bibliotecii statice

int main() {
  // Apelarea funcției din biblioteca statică
  static_function();
  return 0;
}

Exemplu de utilizare a unei biblioteci dinamice în C++ (condițional):

// main.cpp
#include <dlfcn.h> // Pentru funcții de încărcare a bibliotecilor dinamice

int main() {
  // Încărcarea bibliotecii dinamice
  void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
  if (!handle) {
    // Tratarea erorii
  }

  // Obținerea adresei funcției din bibliotecă
  void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
  if (!dynamic_function) {
    // Tratarea erorii
  }

  // Apelarea funcției
  dynamic_function();

  // Închiderea bibliotecii
  dlclose(handle);

  return 0;
}