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