Sobes.tech
Junior

Quels types de bibliothèques connaissez-vous et quelles en sont les différences?

sobes.tech IA

Réponse de l'IA

Types de bibliothèques:

  • Bibliothèques statiques (.a sous Linux, .lib sous Windows): Le code de la bibliothèque est intégré directement dans le fichier exécutable de l'application lors de la compilation. L'application devient plus grande, mais ne dépend pas de la présence de la bibliothèque elle-même dans le système au moment de l'exécution. Chaque application utilisant une bibliothèque statique possède sa propre copie du code.
  • Bibliothèques dynamiques (partagées) (.so sous Linux, .dll sous Windows): Le code de la bibliothèque est chargé en mémoire par l'application lors de l'exécution. Cela réduit la taille du fichier exécutable de l'application. Plusieurs applications peuvent utiliser une même copie de la bibliothèque, ce qui économise de la mémoire. Pour que l'application fonctionne correctement, la bibliothèque dynamique doit être présente dans le système.

Principales différences:

Caractéristique Bibliothèque statique Bibliothèque dynamique
Taille de l'application Plus grande (code intégré) Plus petite (code chargé en temps d'exécution)
Dépendance Absente (code dans le fichier exécutable) Présente (la bibliothèque doit être dans le système)
Utilisation de la mémoire Chaque application a sa propre copie du code Plusieurs applications peuvent utiliser une même copie
Mise à jour du code Nécessite de recompiler l'application La bibliothèque peut être mise à jour séparément

Exemple d'utilisation d'une bibliothèque statique en C++ (conditionnel):

// main.cpp
#include "static_library.h" // Fichier d'en-tête de la bibliothèque statique

int main() {
  // Appel de la fonction de la bibliothèque statique
  static_function();
  return 0;
}

Exemple d'utilisation d'une bibliothèque dynamique en C++ (conditionnel):

// main.cpp
#include <dlfcn.h> // Pour les fonctions de chargement de bibliothèques dynamiques

int main() {
  // Charger la bibliothèque dynamique
  void* handle = dlopen("dynamic_library.so", RTLD_LAZY);
  if (!handle) {
    // Gérer l'erreur
  }

  // Obtenir l'adresse de la fonction dans la bibliothèque
  void (*dynamic_function)(void) = (void (*)(void))dlsym(handle, "dynamic_function");
  if (!dynamic_function) {
    // Gérer l'erreur
  }

  // Appeler la fonction
  dynamic_function();

  // Fermer la bibliothèque
  dlclose(handle);

  return 0;
}