Comment appeler une fonction d'une bibliothèque partagée?
Quelle est la méthode la plus simple et la plus sûre manière d'appeler une fonction d'une bibliothèque partagée /dll? Je suis surtout intéressé à le faire sur linux, mais ce serait mieux si il y avait une plate-forme indépendante.
Quelqu'un pourrait-il fournir un exemple de code pour montrer comment faire le travail suivant, où l'utilisateur a compilé sa propre version de foo
dans une bibliothèque partagée?
//function prototype, implementation loaded at runtime:
std::string foo(const std::string);
int main(int argc, char** argv) {
LoadLibrary(argv[1]); //loads library implementing foo
std::cout << "Result: " << foo("test");
return 0;
}
BTW, je sais comment faire pour compiler le partagé lib (foo.so
), j'ai juste besoin de savoir un moyen facile de le charger au moment de l'exécution.
OriginalL'auteur Frank | 2010-03-29
Vous devez vous connecter pour publier un commentaire.
REMARQUE: Vous êtes de passage des objets en C++ (dans ce cas chaînes de caractères STL) autour de la bibliothèque d'appels. Il est pas de standard C++ ABI à ce niveau, alors essayez d'éviter de porter des objets C++, ou de s'assurer que votre bibliothèque et votre programme ont été construits avec le même compilateur (idéalement le même compilateur sur la même machine, afin d'éviter toute subtile relatives à la configuration de surprises.)
Ne pas oublier de déclarer votre exporté méthodes
extern "C"
à l'intérieur de votre bibliothèque de code.Le dessus ayant été dit, ici, c'est du code la mise en œuvre de ce que vous avez dit que vous voulez atteindre:
Vous pouvez résumé cette plus:
Dans le second bloc de code.
Ce sujet de la fonction name mangling en C++, ne serait-ce pas compliquer les choses? Aussi, que vous avez mal orthographié windows ici
#include <sindows.h>
bon point, j'ai ajouté un préambule traiter avec
extern "C"
etc.OriginalL'auteur vladr
LoadLibrary est une fonction de Windows pour le chargement des Dll. Vous pouvez vérifier le symbole de l'existence avec GetProcAddress. Sur Linux/Unix, vous voulez dlopen/dlsym. Pour ce faire, dans la croix-plate-forme, vous pouvez écrire une fonction qui appelle une de ces méthodes à l'aide de pré-processeur, donc, quelque chose comme:
C'est une façon de réaliser ce genre de chose. Vous pouvez également le faire en incluant un en-tête différent dans votre arborescence des sources de plate-forme spécifique implémentations de fonctions. C'est probablement une meilleure façon. Dans les deux cas, l'idée est d'extraire à partir de l'API sous-jacente.
OriginalL'auteur
Sur Linux, vous devez utiliser dlsym. Voir un exemple à la fin de la page.
Sur La Fenêtre: GetProcAddress.
OriginalL'auteur Sergei Kurenkov