IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Chargement de classe via dlopen


Sujet :

C++

  1. #1
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut Chargement de classe via dlopen
    Bonjour,

    J'ai un souci lors de la création d'un programme qui doit charger un module.

    Pour charger ma librairie dynamiquement, j'utilise la fonction dlopen.

    Après avoir suivi ce qui est écrit ici : http://www.tldp.org/HOWTO/C++-dlopen/thesolution.html j'arrive donc a charger une classe correctement.

    Le problème intervient lorsque je souhaite que ma classe me retourne une autre classe qui à été définit dans le module. En gros on pourrait représenter cela comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [PROGRAMME PRINCIPAL]
    - contient ModuleTemplate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [MODULE]
    - contient une classe A
    - contient ModuleTemplate
    - contient une classe dérivée de ModuleTemplate qui peux retourner un objet de type A

    Tant que je n'inclus pas la classe A tout vas bien, dès que je l'ajoute, j'obtient une erreur du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libclient.so: undefined symbol: _ZTV8FGestion
    J'en conclut que le fait de contenir la définition de la classe A dans le .so ne suffit pas.
    Mais alors comment faire ?

    Merci d'avance
    J'aime pas les épinards... Mais alors pas du tout

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tant que je n'inclus pas la classe A tout vas bien, dès que je l'ajoute, j'obtient une erreur du type :
    Quand tu l'ajoutes dans le programme principale ?

    La fonction Gestion est un membre de A ?
    L'itération est humaine; la récursion, divine.

  3. #3
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    En fait FGestion (que j'ai nommé A dans mon exemple) est une classe dérivée de QWidget (je programme en Qt).

    Ma classe abstraite Moduletemplate contient une méthode qui me retourne un vecteur de QWidget *.

    J'ai donc surcharger cette méthode dans mon module pour me retourner un vecteur contenant des objets de type FGestion *.

    Si cette méthode se contente de retourner des objets de type QWidget * "purs" tout fonctionne. Des que je tente de retourner une classe dérivée de QWidget, j'ai mon erreure.
    J'aime pas les épinards... Mais alors pas du tout

  4. #4
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Bon... J'ai modifier la structure de mon programme mais ca ne marche toujours pas.

    J'ai une classe A qui hérite de ModulePattern et de QWidget.

    Je récupère ce module, et, étaint un QWidget je tente de l'ajouter dans un autre Widget de Qt... La il me plante completement.

    La pile d'instruction donnée par GDB est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #0  0xb7a6c52c in QApplicationPrivate::notify_helper (this=0x8051168, receiver=0x80f9590, e=0x80d04e8) at kernel/qapplication.cpp:3137
    #1  0xb7a6e294 in QApplication::notify (this=0xbfecd450, receiver=0x80f9590, e=0x80d04e8) at kernel/qapplication.cpp:3098
    #2  0xb7902893 in QCoreApplication::sendEvent (receiver=0x80f9590, event=0x80d04e8) at qcoreapplication.h:171
    #3  0xb7902101 in QCoreApplication::sendPostedEvents (receiver=0x0, event_type=0) at kernel/qcoreapplication.cpp:974
    #4  0xb792b068 in QEventDispatcherUNIX::processEvents (this=0x80559e8, flags=@0xbfeccf1c) at kernel/qeventdispatcher_unix.cpp:737
    #5  0xb7aed0fd in QEventDispatcherX11::processEvents (this=0x80559e8, flags=@0xbfeccf54) at kernel/qeventdispatcher_x11.cpp:128
    #6  0xb78fc1d9 in QEventLoop::processEvents (this=0xbfeccfd8, flags=@0xbfeccf8c) at kernel/qeventloop.cpp:124
    #7  0xb78fc45b in QEventLoop::exec (this=0xbfeccfd8, flags=@0xbfeccfe0) at kernel/qeventloop.cpp:164
    #8  0xb790233c in QCoreApplication::exec () at kernel/qcoreapplication.cpp:662
    #9  0xb7a6bb6c in QApplication::exec () at kernel/qapplication.cpp:2682
    #10 0x0804df7d in main (argc=1, argv=0xbfecd4e4) at main.cpp:30
    La je sèche... comment vérifier que mon objet est bien un QWidget quand je l'integre à mon application ? Pourquoi est ce que l'objet récupèrer ne serait pas convenable pour servir de Widget ?

    Merci
    J'aime pas les épinards... Mais alors pas du tout

  5. #5
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Bon après moultes expériences, je me suis rendu compte que mon programme principal ne veux pas convertir mon module en QWidget certainement parce qu'il est définit comme étant un QWidget dans mon module et non dans mon template.

    Existe t'il un moyen de transtyper une classe d'un type B vers un type A sachant que l'on définit que B est dérivé de A dans le module ?
    J'aime pas les épinards... Mais alors pas du tout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2009, 01h43
  2. [FLASH 8] Chargement d'images via XML.
    Par Begood dans le forum Flash
    Réponses: 1
    Dernier message: 01/03/2006, 11h32
  3. [SunOne] Problème de chargement de classe Xerces sous SunOne
    Par cocula dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 11/01/2006, 15h46
  4. Réponses: 4
    Dernier message: 28/03/2005, 12h37
  5. [Chargement de classe][noms de classe relatifs]
    Par freudy dans le forum Langage
    Réponses: 5
    Dernier message: 21/04/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo