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

Qt Discussion :

Édition des liens - undefined symbol: _ZNK5QtLib6getKeyEv


Sujet :

Qt

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Édition des liens - undefined symbol: _ZNK5QtLib6getKeyEv
    Bonsoir,

    j'ai un gros souci avec ma lib_Qt.so, je m'en remets donc a vous car je n'arrive pas a resoudre ce probleme.

    Mon projet consiste a coder un Snake compatible avec 3 bibliotheques graphiques differentes (SDL, minilibX, Qt). Les libs graphiques se contentent uniquement de l'affichage. Pour ce faire, j'utilise dlopen, dlsym et dlclose afin d'avoir un code uniforme et generique. Je donne a mon executable une largeur, une hauteur (pour la map) et la bibliotheque desiree (SDL, minilibX ou Qt). Exemple : ./nibbler 50 50 lib_Qt.so

    Voici a quoi ressemble mon main, afin de vous faire comprendre le pourquoi du comment :

    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
    int             main(int argc, char **argv)
    {
      if ((check_args(argc, argv)) == -1)
        return 1;
      ILib*         (*external_creator)(int, int, int, char **);
      void          *dlhandle;
      Nibbler       nib(atoi(argv[1]), atoi(argv[2]));
      int           stop = 0;
     
      srand(time(NULL));
      dlhandle = dlopen(argv[3], RTLD_LAZY);
      if (dlhandle == NULL)
        {
          std::cerr << "ERROR : " << argv[3] << " is not existing or is not support." << std::endl;
          std::cerr << dlerror() << std::endl;
          return 1;
        }
      external_creator = reinterpret_cast<ILib* (*)(int, int, int, char **)>(dlsym(dlhandle, "create_lib"));
      if (external_creator == NULL)
        return 1;
     
      ILib          *lib = external_creator(atoi(argv[1]), atoi(argv[2]), argc, argv);
     
      while (stop != -1 && stop != -2)
        {
          nib.pop_food();
          nib.eat();
          lib->Do_Event();
          if (lib->getKey() == 1)
            stop = nib.move("a");
          else if (lib->getKey() == 2)
            stop = nib.move("d");
          else if (lib->getKey() == -1)
            stop = -2;
          lib->Display_Snake(nib.getBody());
          lib->Display_Food(nib.getFood());
                if ((lib->Handle_Time()) == 1)
                  stop = nib.move("avance");
          lib->setKey(3);
        }
      if (stop == -1)
        std::cout << "Perdu !" << std::endl;
      else if (stop == -2)
        std::cout << "T'abandonnes ? Tafiole !" << std::endl;
      delete lib;
      dlclose(dlhandle);
      return 0;
    La partie SDL est finie ainsi que la minilibX (excepte quelques bugs sans rapport avec cette discussion). Il n'y a que la partie Qt qui me bloque.
    Lorsque j'essaie d'ouvrir ma lib_Qt.so, dlopen fail et dlerror m'indique ce message :
    undefined symbol: _ZNK5QtLib6getKeyEv

    On peut remarquer getKeyEv dans l'erreur. getKey est un getter qui me permet de savoir si la touche appuyee est la touche droite, gauche, etc. En fonction de la touche pressee, je set un nombre (avec setKey(int)) puis le recupere avec le getter dans le main afin de tourner dans la bonne direction.

    Je suppose que ce probleme vient du Makefile, pendant le linkage. Je n'arrive pas a trouver la solution. Voici en piece jointes le Makefile qui cree ma lib_Qt.so et le Qt.pro. A savoir que j'utilise des fonctions surchargees pour Qt (keyPressEvent et paintEvent).
    Il doit surement manquer un flag, mais le Makefile genere est tellement fouilli que j'ai du mal a m'y retrouver...

    Je vous remercie pour vos eclairages. N'hesitez pas a me poser des questions si ce n'est pas clair !

    P.S : desole pour les accents, je suis sur un qwerty et je n'ai pas trop le temps (je dois rendre mon projet dimanche).
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Je pense que ce qu'il faudrait voir c'est le header de ta lib : la classe est bien exportée ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Desole mais je ne comprends pas ta question (c'est assez nouveau pour moi). Si ca peut t'aider, je place l'appel au constructeur de chaque classe dans un extern, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    extern "C"
    {
      ILib* create_lib(int width, int height, int argc, char **argv)
      {
        return new SDL(width, height, argc, argv);
      }
    }
    Le core du jeu se trouve a la racine, les bibliothèques graphiques dans leurs dossiers respectifs (SDL, mlx, Qt).

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je suis vraiment perplexe sur la méthode à utiliser pour ce genre de programme multilib.
    Pourquoi ne pas simplement utiliser une interface que l'on hériterai à chaque fois que l'on veut implémenter une nouvelle bibliothèque ? (l'interface peut finalement être templatisé (voir les politiques)).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Je voudrais voir le fichier où sont déclarées les méthodes que tu utilises (getKey() notamment puisque tu as un problème avec). J'avoue mieux connaitre la méthode décrite par LittleWhite.

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    LittleWhite => A moins d'avoir mal compris ton post, c'est exactement ce que je fais. L'objectif de ce projet est de pouvoir jouer avec différentes librairies à sa guise, en la donnant en paramètre avec l’exécutable. Voici mon interface ILib :

    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
    #ifndef _ILIB_HH_
    # define _ILIB_HH_
     
    class	Food;
    class	Coord;
     
    class	ILib
    {
    public:
      virtual void	Do_Event() = 0;
      virtual void	Display_Snake(const std::list<Coord>&) = 0;
      virtual void	Display_Food(const Food&) const = 0;
      virtual int	Handle_Time() const = 0;
      virtual int	getKey() const = 0;
      virtual void	setKey(int) = 0;
    private:
    };
     
    #endif /*!_ILIB_HH_*/
    Mes classes SDL, Qt et Mlx héritent de cette interface. Ainsi, je redéfinis les fonctions pour chaque class afin d'obtenir le comportement demandé.

    Dans mon main, je définis un pointeur sur fonctions de type ILib. A l'aide de dlopen, j'ouvre la librairie donnée en paramètre (SDL, Qt ou Mlx). Ensuite, je vais chercher le constructeur de la librairie avec dlsym (le symbole est "create_lib", une fonction qui est mise en extern et qui appelle le constructeur, voir mon post plus haut).

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Ok, je vois

    Il se peut que l'erreur soit aussi à cause qu'il faille lier les bibliothèque de Qt, lorsque vous utilisez votre bibliothèque à vous. (les QtCore.lib et autres). Sinon, les fonctions appelés dans votre lib_Qt , ne seront toujours pas trouvées.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Je suppose qu'il faut linker dans le .pro, dans l'attribut LIBS ? Néanmoins je ne sais pas trop quoi mettre à l'intérieur

    Comment rater un projet complet probablement à cause d'un flag pourrave...

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Je me demande même s'il ne faudrait pas lié les bibliothèques en statique lors de la création de votre lib_Qt. Sinon, cela dépend de comment vous créez la lib_Qt. Si vous utilisez qmake (et le fichier .pro) alors en théorie, le liage des bibliothèque est fait avec la ligne :
    QT += core
    Il faut donc lire la documentation pour voir comment faire mieux.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre aide. Finalement j'ai trouve mon erreur, je suis un gros debile. Sous la pression j'ai oublie de redefinir getKey() et setKey(int) pour la classe QtLib... donc ca fonctionne maintenant.

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

Discussions similaires

  1. [édition des liens] ld: Missing library symbol table in
    Par kaloskagatos dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/08/2006, 11h27
  2. [VC++] Erreur d'édition des liens LNK1143
    Par Yellowmat dans le forum MFC
    Réponses: 6
    Dernier message: 01/02/2006, 15h00
  3. [Dev-C++] Problème d'édition des liens
    Par shura dans le forum EDI
    Réponses: 5
    Dernier message: 30/08/2005, 09h35
  4. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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