Chargement de fichier *.so sous Linux

Chargement de fichier *.so sous Linux - C++ - Programmation

Marsh Posté le 03-12-2002 à 14:48:25    

Bonjour !
 
J'ai un petit problème concernant le chargement de fichiers *.so (librairies dynamiques). Voilà mon problème :
 
j'ai une classe "Mineur" qui hérite d'une classe "Personnage". Dans la classe personnage, j'ai un attribut "protected" qui s'appelle "Cout" et qui est de type "Ressource", une autre classe. Dans le constructeur de "Mineur", je dois initialiser l'attribut Cout au moyen de la méthode "Ressource::SetRessource(int, int, int, int)" donc dans le constructeur je fais Cout.SetRessource(1,2,3,4)
 
Vous me suivez?
 
Mon but est de créer le classe "Mineur" en librairie dynamique (Mineur.so) et de l'appeler à partir d'un programme. Cependant, lorsque j'essaie d'ouvrir le fichier avec la fonction "dlopen" il me génère une erreur suivante :
 
./Fermier.so: undefined symbol: SetRessource__9Ressourceiiii
 
Est-ce que quelqu'un a une idée sur le sujet ? Merci.


---------------
Je suis un franco-canado-québécois d'origine française de l'Amérique du nord francophone.
Reply

Marsh Posté le 03-12-2002 à 14:48:25   

Reply

Marsh Posté le 03-12-2002 à 14:50:51    

dis voir comment tu compiles, pour commencer

Reply

Marsh Posté le 03-12-2002 à 14:57:50    

Ça ressemble un peu à ça. J'ai fait légèrement le ménage de manière garder seulement l'essentiel (il y a un 20aine de classes en tout mais les autres ne sont pas utilisées pour ce test).
 

Code :
  1. test : main.o Mineur.so Personnage.o Ressource.o
  2. g++ -g -o test main.o Personnage.o Ressource.o -ldl -lm
  3. main.o : main.cpp
  4. g++ -g -c -o main.o main.cpp
  5. Mineur.so : Mineur.cpp Mineur.h
  6. g++ -shared -o Mineur.so Mineur.cpp
  7. Personnage.o : Personnage.cpp Personnage.h
  8. g++ -g -c -o Personnage.o Personnage.cpp
  9. Ressource.o : Ressource.cpp Ressource.h
  10. g++ -g -c -o Ressource.o Ressource.cpp

 
 
Au début je me suis dit que je devais peut-être rajouter l'option -c pour Mineur.so mais ça me fait une erreur lorsque je mets cette option.


---------------
Je suis un franco-canado-québécois d'origine française de l'Amérique du nord francophone.
Reply

Marsh Posté le 03-12-2002 à 15:18:28    

C'est correct, ca...
Donc le problème est ailleurs.  
j'ai jamais utilisé dlopen() avec du c++, seulement du c :/
c'est pas un probleme d'incompatibilité entre les deux ?
 
sinon, solution de rechange, tu as essayé de mettre aussi Ressource dans ta bibliothèque ?

Reply

Marsh Posté le 03-12-2002 à 15:31:22    

Je pense justement que le problème vient de l'incompatibilité entre le C et le C++.


---------------
Je suis un franco-canado-québécois d'origine française de l'Amérique du nord francophone.
Reply

Marsh Posté le 04-12-2002 à 07:44:12    

je vois 2 pb dans ton Makefile:
 
à lire le mnuale de make; faut pas utiliser -c et -o en meme temps
 
et si la lib partagée est modifiée, le binaire sera recompilé, donc aucun interet.


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 04-12-2002 à 10:42:58    

Taz@PPC a écrit a écrit :

 
à lire le mnuale de make; faut pas utiliser -c et -o en meme temps




pourtant je le fais aussi  [:sinclaire]  
et ca marche en plus

Reply

Marsh Posté le 04-12-2002 à 10:43:57    

lorill a écrit a écrit :

 
pourtant je le fais aussi  [:sinclaire]  
et ca marche en plus




 
Bah, a part foutre la merde en changeant le nom par défaut des .o, je vois pas l'intêret


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 04-12-2002 à 10:44:21    

kadreg a écrit a écrit :

 
Bah, a part foutre la merde en changeant le nom par défaut des .o, je vois pas l'intêret




les foutre dans un autre répertoire  [:sinclaire]

Reply

Marsh Posté le 04-12-2002 à 17:55:32    

Merci bien, j'ai règlé mon problème.
 
J'ai une autre question par contre : dans ma classe, j'ai des objets OpenGL et une méthode Afficher(). Cependant, lorsque je compile, les composantes OpenGL n'ont pas l'air de se linker correctement.  
 
Le makefile :
 
Fermier.so : Fermier.cpp Fermier.h  
 g++ -shared -o Fermier.so Fermier.cpp -L/usr/X11R6/lib -lGL -lGLU -lglut -lXi -lXmu -lXext -lX11 -ldl -lm
 
Quand je fais la commande nm Fermier.so, il m'indique que les fonctions OpenGL n'ont pas de symboles (elles sont précédés de U)
Ex :     U gluDeleteQuadric
         U gluNewQuadric
         U gluQuadricDrawStyle
         U gluQuadricNormals
         U gluSphere
 
Je suis capable d'accéder à mes autres méthodes de la classe mais si j'utilise la méthode Afficher() ça ne compile même plus.
Que dois-je faire ?


Message édité par Matheo le 04-12-2002 à 17:56:48

---------------
Je suis un franco-canado-québécois d'origine française de l'Amérique du nord francophone.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed