Sobes.tech
Junior

Welke soorten bibliotheken ken je en wat zijn de verschillen?

sobes.tech AI

Antwoord van AI

Soorten bibliotheken:

  • Statische bibliotheken (.a op Linux, .lib op Windows): De code van de bibliotheek wordt direct in het uitvoerbare bestand van de applicatie ingebouwd tijdens het compileren. De applicatie wordt groter, maar is niet afhankelijk van de aanwezigheid van de bibliotheek zelf in het systeem tijdens het uitvoeren. Elke applicatie die een statische bibliotheek gebruikt, heeft een eigen kopie van de code.
  • Dynamische (gedeelde) bibliotheken (.so op Linux, .dll op Windows): De code van de bibliotheek wordt tijdens het uitvoeren in het geheugen van de applicatie geladen. Dit verkleint de grootte van het uitvoerbare bestand van de applicatie. Meerdere applicaties kunnen dezelfde kopie van de bibliotheek gebruiken, wat geheugen bespaart. Voor correcte werking moet de dynamische bibliotheek aanwezig zijn in het systeem.

Belangrijkste verschillen:

Kenmerk Statische bibliotheek Dynamische bibliotheek
Grootte van de applicatie Groter (code ingebouwd) Kleiner (code wordt tijdens uitvoering geladen)
Afhankelijkheid Afwezig (code binnen het uitvoerbare bestand) Aanwezig (de bibliotheek moet in het systeem staan)
Geheugengebruik Elke applicatie heeft een eigen kopie van de code Meerdere applicaties kunnen één kopie gebruiken
Code-updates Vereist hercompilatie van de applicatie De bibliotheek kan apart worden bijgewerkt

Voorbeeld van gebruik van een statische bibliotheek in C++ (voorwaardelijk):

// main.cpp
#include "static_library.h" // Headerbestand van de statische bibliotheek

int main() {
  // Aanroep van functie uit de statische bibliotheek
  static_function();
  return 0;
}

Voorbeeld van gebruik van een dynamische bibliotheek in C++ (voorwaardelijk):

// main.cpp
#include <dlfcn.h> // Voor functies voor het laden van dynamische bibliotheken

int main() {
  // Laad de dynamische bibliotheek
  void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
  if (!handle) {
    // Foutafhandeling
  }

  // Verkrijg het adres van de functie uit de bibliotheek
  void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
  if (!dynamic_function) {
    // Foutafhandeling
  }

  // Roep de functie aan
  dynamic_function();

  // Sluit de bibliotheek
  dlclose(handle);

  return 0;
}