Maison >développement back-end >C++ >Comment puis-je créer et utiliser des bibliothèques partagées dynamiques (DSL) en C sous Linux ?

Comment puis-je créer et utiliser des bibliothèques partagées dynamiques (DSL) en C sous Linux ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-05 20:24:12467parcourir

How Can I Create and Use Dynamic Shared Libraries (DSLs) in C   on Linux?

Création et utilisation de bibliothèques partagées dynamiques en C sous Linux

Les bibliothèques partagées dynamiques (DSL) permettent à plusieurs programmes de partager du code, réduisant ainsi l'utilisation de la mémoire et améliorer l'efficacité. En C , les DSL permettent la création de bibliothèques de classes réutilisables accessibles à plusieurs exécutables.

Création du DSL

Pour créer un DSL, définissez l'interface de classe et l'implémentation dans l'en-tête et les fichiers sources (par exemple, myclass.h et myclass.cc). Assurez-vous que la classe inclut un destructeur virtuel et des méthodes publiques marquées extern "C" pour faciliter le chargement des symboles.

Utilisation du DSL

Pour utiliser un DSL dans un exécutable séparé, effectuez les étapes suivantes :

  1. Incluez les bibliothèques nécessaires () et en-têtes.
  2. Utilisez dlopen() pour charger la bibliothèque partagée.
  3. Accédez aux fonctions et symboles de la bibliothèque à l'aide de dlsym().
  4. Appelez la fonction create_object() pour instancier un objet de la classe bibliothèque.
  5. Appelez les méthodes de l'objet.
  6. Détruisez l'objet en utilisant destroy_object().

Exemple Code

maclasse.h

#include <iostream>

class MyClass {
public:
  MyClass();
  virtual void DoSomething();
private:
  int x;
};

maclasse.cc

#include "myclass.h"

extern "C" MyClass* create_object() {
  return new MyClass;
}

extern "C" void destroy_object(MyClass* object) {
  delete object;
}

MyClass::MyClass() {
  x = 20;
}

void MyClass::DoSomething() {
  std::cout << x << std::endl;
}

class_user .cc

#include <dlfcn.h>
#include <iostream>
#include "myclass.h"

int main() {
  void* handle = dlopen("./myclass.so", RTLD_LAZY);
  MyClass* (*create)();
  void (*destroy)(MyClass*);

  create = (MyClass* (*)())dlsym(handle, "create_object");
  destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");

  MyClass* myClass = create();
  myClass->DoSomething();
  destroy(myClass);
}

Compilation et Exécution

Sous Mac OS X :

  • Compilez le DSL : g -dynamiclib -flat_namespace myclass.cc -o myclass.so
  • Compilez l'exécutable utilisateur : g class_user.cc -o class_user

Sous Linux :

  • Compilez le DSL : g -fPIC -shared myclass.cc -o myclass.so
  • Compilez l'exécutable utilisateur : g class_user.cc -ldl -o class_user

Exécutez class_user pour utiliser la bibliothèque partagée MyClass. Il instanciera et utilisera l'objet MyClass avec succès.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn