Quelle est la façon la plus simple d'écrire des bibliothèques portables chargeables dynamiquement en C ++?

StackOverflow https://stackoverflow.com/questions/3561022

Question

Je travaille sur un projet qui a de multiples chemins de code semblables que je voudrais séparer du projet principal en plug-ins. Le projet doit rester multiplateforme compatible, et toutes les bibliothèques dynamiques API de chargement, je l'ai regardé dans la plate-forme sont spécifiques.

Quelle est la façon la plus simple de créer un système de chargement de bibliothèque dynamique qui peut être compilé et exécuté sur plusieurs systèmes d'exploitation sans modification supplémentaire du code? Idéalement, je voudrais écrire un plugin, et le faire fonctionner sur tous les systèmes d'exploitation les supports du projet.

Merci.

Était-ce utile?

La solution

Vous devez utiliser le code dépendant de la plate-forme pour la système de chargement . Il est différent de chargement DLL sous Windows que le chargement d'un objet partagé sous Unix. Mais, avec un couple de #ifdef, vous serez en mesure d'avoir la plupart du temps la même base de code dans le chargeur.

Cela dit, je pense que vous pouvez faire vos plugins indépendants de la plate-forme. Bien sûr, vous devrez compiler pour chaque plate-forme, mais le code sera 99% même.

Autres conseils

Bibliothèque dynamique du chargement d'un Windows et Unix / Linux fonctionne avec 3 fonctions. Une paire de fonctions pour charger / décharger les bibliothèques, et une autre fonction pour obtenir l'adresse d'une fonction dans la bibliothèque. Vous pouvez facilement écrire un wrapper autour de ces trois fonctions pour fournir des systèmes d'exploitation cross suppport.

  

Idéalement, je voudrais écrire un plugin, et le faire fonctionner sur tous les systèmes d'exploitation les supports du projet.

Peu de choses de haut de ma tête:

  • Les objets statiques Évitez les bibliothèques dynamiques. Mise à disposition des méthodes d'initialisation appropriées / fonctions pour allouer les objets. Les problèmes qui se produisent au cours de bibliothèque chargés par le système d'exploitation (ce qui est quand les c'tors pour les objets statiques sont appelés) sont très difficiles à déboguer -. Suivant uniquement les problèmes de traitement multithread

  • têtes d'interface ne peuvent pas contenir du code. Aucune méthode inline, pas de préprocesseur. Définit C'est d'éviter l'application entachant avec le code de la version particulière de la bibliothèque, ce qui rend impossible de remplacer la bibliothèque au plus tard.

  • têtes d'interface ne peuvent pas contenir des classes elles-mêmes de mise en œuvre - seules les classes abstraites et fonctions d'usine . Similaire au point précédent - à la demande d'éviter dépendent de la version particulière des classes. Les usines sont nécessaires comme un moyen pour l'application utilisateur instancier les classes de mise en œuvre concrète.

  • Lors de l'introduction d'une nouvelle version d'une interface, de garder les choses en quelque sorte rétrocompatible, ne modifiez pas classe abstraite existante - créer une nouvelle classe abstraite héritée de et ajouter de nouvelles méthodes là-bas. Changement usine pour retourner la nouvelle version. (MS Recall » IInterface, IInterface2, IInterface3 et ainsi de suite.) Dans la mise en œuvre, utilisez la version plus récente de la classe abstraite. Que par polymorphisme ferait reculer la mise en œuvre compatible avec les versions d'interface plus. (Cela demande évidemment pour l'entretien périodique d'interface et nettoyages -. Pour enlever l'ancien cochonneries)

Jetez un oeil à la bibliothèque de boost.extension, ce n'est pas vraiment partie de coup de pouce, mais vous pouvez le trouver dans le bac à sable. Il est une sorte de gelée aussi, mais dans l'ensemble de la bibliothèque est stable et facile à utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top