Sobes.tech
Junior

Welche Arten von Bibliotheken kennen Sie und was sind ihre Unterschiede?

sobes.tech KI

Antwort von AI

Arten von Bibliotheken:

  • Statische Bibliotheken (.a unter Linux, .lib unter Windows): Der Code der Bibliothek wird direkt in die ausführbare Datei der Anwendung während der Kompilierung eingebunden. Die Anwendung wird größer, ist aber nicht abhängig von der Anwesenheit der Bibliothek im System zur Laufzeit. Jede Anwendung, die eine statische Bibliothek verwendet, hat eine eigene Kopie des Codes.
  • Dynamische (shared) Bibliotheken (.so unter Linux, .dll unter Windows): Der Code der Bibliothek wird zur Laufzeit in den Speicher der Anwendung geladen. Dies verkleinert die Größe der ausführbaren Datei. Mehrere Anwendungen können eine Kopie der Bibliothek gemeinsam nutzen, was Speicher spart. Damit die Anwendung korrekt funktioniert, muss die dynamische Bibliothek im System vorhanden sein.

Hauptunterschiede:

Merkmal Statische Bibliothek Dynamische Bibliothek
Größe der Anwendung Größer (Code wird eingebunden) Kleiner (Code wird zur Laufzeit geladen)
Abhängigkeit Nicht vorhanden (Code im ausführbaren File) Vorhanden (Bibliothek muss im System sein)
Speicherverbrauch Jede Anwendung hat eine eigene Kopie des Codes Mehrere Anwendungen können eine Kopie nutzen
Code-Update Erfordert Neukompilierung der Anwendung Bibliothek kann separat aktualisiert werden

Beispiel für die Verwendung einer statischen Bibliothek in C++ (bedingt):

// main.cpp
#include "static_library.h" // Header-Datei der statischen Bibliothek

int main() {
  // Aufruf einer Funktion aus der statischen Bibliothek
  static_function();
  return 0;
}

Beispiel für die Verwendung einer dynamischen Bibliothek in C++ (bedingt):

// main.cpp
#include <dlfcn.h> // Für Funktionen zum Laden dynamischer Bibliotheken

int main() {
  // Laden der dynamischen Bibliothek
  void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
  if (!handle) {
    // Fehlerbehandlung
  }

  // Adresse der Funktion aus der Bibliothek holen
  void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
  if (!dynamic_function) {
    // Fehlerbehandlung
  }

  // Funktion aufrufen
  dynamic_function();

  // Bibliothek schließen
  dlclose(handle);

  return 0;
}