Sobes.tech
Junior

Quali tipi di biblioteche conosci e quali sono le loro differenze?

sobes.tech AI

Risposta dell'AI

Tipi di librerie:

  • Librerie statiche (.a su Linux, .lib su Windows): Il codice della libreria viene incorporato direttamente nel file eseguibile dell'applicazione durante la compilazione. L'applicazione diventa più grande, ma non dipende dalla presenza della libreria stessa nel sistema al momento dell'esecuzione. Ogni applicazione che utilizza una libreria statica ha una propria copia del codice.
  • Librerie dinamiche (condivise) (.so su Linux, .dll su Windows): Il codice della libreria viene caricato in memoria dall'applicazione durante l'esecuzione. Questo riduce la dimensione del file eseguibile dell'applicazione. Più applicazioni possono usare una stessa copia della libreria, risparmiando memoria. Per il corretto funzionamento, la libreria dinamica deve essere presente nel sistema.

Principali differenze:

Caratteristica Libreria statica Libreria dinamica
Dimensione dell'applicazione Più grande (codice incorporato) Più piccola (codice caricato in runtime)
Dipendenza Assente (codice all'interno del file eseguibile) Presente (la libreria deve essere nel sistema)
Uso della memoria Ogni applicazione ha una propria copia del codice Più applicazioni possono usare una stessa copia
Aggiornamento del codice Richiede recompilazione dell'applicazione La libreria può essere aggiornata separatamente

Esempio di utilizzo di una libreria statica in C++ (condizionale):

// main.cpp
#include "static_library.h" // Header della libreria statica

int main() {
  // Chiamata di funzione dalla libreria statica
  static_function();
  return 0;
}

Esempio di utilizzo di una libreria dinamica in C++ (condizionale):

// main.cpp
#include <dlfcn.h> // Per funzioni di caricamento di librerie dinamiche

int main() {
  // Caricare la libreria dinamica
  void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
  if (!handle) {
    // Gestione errore
  }

  // Ottenere l'indirizzo della funzione dalla libreria
  void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
  if (!dynamic_function) {
    // Gestione errore
  }

  // Chiamare la funzione
  dynamic_function();

  // Chiudere la libreria
  dlclose(handle);

  return 0;
}