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:
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;
}
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
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;*/
 
}
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
 
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
Voilà pour le code...
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