Bonjour à tous, je fais face à un problème depuis plusieurs heures déjà...
En effet, je tente en vain de charger une méthode à l'aide des fonction dlopen() et dlsym(). Le chargement de la bibliothèque se passe correctement mais la méthode n'est pas trouvée! Pour tester le le concept, j'ai récupérer des exemples simple du net dans les tuto comme l'exemple qui suit:
J'ai une library:
Voici mon code appelant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include<iostream> using std::cout; using std::endl; int entry() { cout<<"I am module one!\n"<<endl; return 0; }
et enfin le Makefile (très simple):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 #include <iostream> #include <dlfcn.h> #include <errno.h> using std::cout; using std::cerr; using std::endl; int main(void) { void * module; char* msg; /* chargez le module, et résolvez les symboles maintenant */ module = dlopen("module1.so", RTLD_LAZY); if(!module) { cerr<<dlerror()<<endl; dlclose(module); exit(1); } cerr<<"the end"<<endl; /* recherchez l'adresse du point d'entrée */ void* my_entry = dlsym(module, "entry"); msg = dlerror(); if(msg != NULL) { perror(msg); dlclose(module); exit(1); } /* appelez le point d'entrée du module */ // int i=reinterpret_cast<int*()>(my_entry)(); //my_entry(); /* fermez le module */ /* if(dlclose(module)) { perror("error"); exit(1); } return 0;*/ }
Voilà pour le code...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CXX=g++ all: $(CXX) -o loader main.cpp -ldl $(CXX) -fPIC -c module1.cpp $(CXX) -shared -o module1.so module1.o $(CXX) -fPIC -c module2.cpp $(CXX) -shared -o module2.so module2.o clean: rm -rf *.so rm -rf *.o rm -rf loader
La suite du main fait référence à un second problème qui m'attend qui est celui du cast du pointeur de fonction. J'ai en effet essayé plusieurs combinaisons en par le static_cast ou bien le typedef tirés d'exemple du net mais aboutissant sans exception à une erreur de compilation
(je suis sur linux, version de gcc 4.1.2)
Merci pour votre aide![]()
Partager