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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du 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
    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 Expert

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    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
    Membre du 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
    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
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    150
    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 Expert

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    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
    Membre du 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
    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).

+ 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