2017-10-11 10 views
0

J'ai un ancien code C++, j'essaie de le re-concevoir. Je souhaite retirer une partie du code du projet en tant que bibliothèque partagée ".so" et les charger dynamiquement par "dlopen".Comment dire à l'éditeur de liens C++ que certaines classes seront ajoutées plus tard par dlopen

J'ai écrit un mécanisme de chargement dynamique qui peut charger dynamiquement de nouveaux modules lors de l'exécution.

Maintenant, je veux découpler les modules existants du projet principal. Par exemple, j'ai extrait le module "X" du projet principal et créé une bibliothèque partagée qui peut être chargée plus tard, mais certaines parties du projet principal utilisent directement les classes du module X et je ne peux pas les modifier pour le moment.

Je peux compiler le projet en utilisant les fichiers d'en-tête du module X, mais l'éditeur de liens rejette l'erreur "référence non définie". Comment puis-je dire à l'éditeur de liens c + + que ces classes seront ajoutées plus tard par le mécanisme dlopen lors de l'exécution?

note: Je peux lier et exécuter le projet en copiant le fichier ".so" créé du module X dans le dossier "/ lib" et l'utiliser lors de la liaison par le drapeau "-lX", mais si je supprime ce fichier/lib Le projet échoue au démarrage.

Répondre

0

Je sais que si vous utilisez les classes de X directement, vous devez lier X.so à votre programme. Mais si vous liez X.so, vous pouvez utiliser dlopen en cours d'exécution.

+0

Oui, mais je souhaite supprimer la dépendance au temps de liaison. J'ai changé les classes X en classes proxy qui appellent des fonctions de module découplées. – Emech

0

Ce dont vous avez besoin s'appelle une bibliothèque d'importation. Ils contiennent des petits wrappers pour toutes les fonctions nécessaires et satisfont ainsi toutes les dépendances de l'éditeur de liens statiques. Au moment de l'exécution, ces wrappers chargeront la bibliothèque dynamique si elle n'est pas encore chargée et transmettront l'exécution à l'implémentation réelle à l'intérieur de la bibliothèque.

Les bibliothèques d'importation sont une fonctionnalité standard des DLL Windows, mais elles ne sont pas prêtes à l'emploi sous Linux (ou n'importe quel système POSIX). Vous pouvez implémenter des wrappers à la main ou utiliser Implib.so pour les générer automatiquement.