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 :

problème de compilation Linux


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut problème de compilation Linux
    bonjour,

    Je suis bloqué depuis qq temps la dessus:

    Citation:
    /bin/mkdir -p exe ; /usr/bin/g++ -ansi -g -o exe/AgentSupervision ../../superviseur/idl/obj/AgentSupervision_c.o ../../superviseur/idl/obj/AgentSupervision_s.o obj/AgentSupervision.o obj/AgentSupervisionImpl.o obj/Ressources.o obj/RessourcesPosix.o ../../traducteurs/idl/obj/Traducteur_c.o ../../traducteurs/idl/obj/ExceptionsTraducteur_c.o obj/ServeurCalcul.o obj/GABASSession.o obj/RessourcesLinux.o -L../../lib -L../../superviseur/lib -lutilsuperviseur -lidlsl_c -lidlstruct -lidlexcept -lrpcsvc -lgab_r -lgaborb_r -lgaborbhelper -L/usr/lib -lTAO_IORTable -lTAO_PortableServer -lTAO_CosNaming -lTAO -lACE -ldl -lnsl -lTAO_Messaging -lgaborbhelper -L../../lib -lgab_r -lpthread
    obj/AgentSupervision.o: dans la fonction « main »:
    src/AgentSupervision.C:109: référence indéfinie vers « GABError::GABError(short, char const*, char const*)»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0x68): référence indéfinie vers « GABObject::throwException(long, char const*, char const*) const»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0x78): référence indéfinie vers « GABObject::print(unsigned long, _IO_FILE*) const»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0x80): référence indéfinie vers « GABObject::gabAddUserDependent(GABObject*, unsigned long, void (*)(GABObject*, GABObject*, void*, unsigned long), void*)»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0x90): référence indéfinie vers « GABObject::gabRemoveUserDependent(GABObject*, unsigned long)»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0xb0): référence indéfinie vers « GABObject::gabSysNotify(GABObject*, unsigned long)»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0xb8): référence indéfinie vers « GABObject::changed(unsigned long)»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0xc0): référence indéfinie vers « GABObject::stateText(long) const»
    obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0x110): référence indéfinie vers « GABObject::classNotify(unsigned long)»
    Est ce quelqu'un peut m'expliquer ce que veut dire ce message d'erreur?

    Je vous remercie d'avance

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    C'est une erreur de link, ton problème doit venir du fait que tu fais des include venant d'une librairie extérieure (celle qui contient les fonctions et classes GAB***) par contre tu n'indiques pas au linker qu'il doit utiliser cette librairie, et il ne trouve donc pas les implémentations des classes et fonctions de cette librairie

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    C'est une erreur de link, ton problème doit venir du fait que tu fais des include venant d'une librairie extérieure (celle qui contient les fonctions et classes GAB***) par contre tu n'indiques pas au linker qu'il doit utiliser cette librairie, et il ne trouve donc pas les implémentations des classes et fonctions de cette librairie
    ces méthodes sont définies dans lgab_r ->>>

    /bin/mkdir -p exe ; /usr/bin/g++ -ansi -g -o exe/AgentSupervision ../../superviseur/idl/obj/AgentSupervision_c.o ../../superviseur/idl/obj/AgentSupervision_s.o obj/AgentSupervision.o obj/AgentSupervisionImpl.o obj/Ressources.o obj/RessourcesPosix.o ../../traducteurs/idl/obj/Traducteur_c.o ../../traducteurs/idl/obj/ExceptionsTraducteur_c.o obj/ServeurCalcul.o obj/GABASSession.o obj/RessourcesLinux.o -L../../lib -L../../superviseur/lib -lutilsuperviseur -lidlsl_c -lidlstruct -lidlexcept -lrpcsvc -lgab_r -lgaborb_r -lgaborbhelper -L/usr/lib -lTAO_IORTable -lTAO_PortableServer -lTAO_CosNaming -lTAO -lACE -ldl -lnsl -lTAO_Messaging -lgaborbhelper -L../../lib -lgab_r -lpthread

    j'indique bien le chemin? ou est ce que ça doit être en relatif?

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Ton chemin est déjà en relatif, apparemment il trouve la lib (sinon le linker te râlerait dessus). Par contre, es-tu sûr que la lib que tu utilises est bien de la même version que les include que tu fais, sinon ça peut aussi venir (d'après mon expérience personnelle) d'un conflit Unicode/Multibyte ou d'un conflit Debug/Release, il doit certainement y avoir d'autres causes, mais je ne les ai pas encore rencontrées, donc tu peux au moins vérifier ces 3 là.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Ton chemin est déjà en relatif, apparemment il trouve la lib (sinon le linker te râlerait dessus). Par contre, es-tu sûr que la lib que tu utilises est bien de la même version que les include que tu fais, sinon ça peut aussi venir (d'après mon expérience personnelle) d'un conflit Unicode/Multibyte ou d'un conflit Debug/Release, il doit certainement y avoir d'autres causes, mais je ne les ai pas encore rencontrées, donc tu peux au moins vérifier ces 3 là.
    tu peux m'expliquer le premier point STP? je ne comprends pas la version de la lib par rapport à la version des includes?

  6. #6
    screetch
    Invité(e)
    Par défaut
    sous linux il n'y a pas de multibyte/unicode.

    elle vient d'ou cette bibliotheque gab_r?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par screetch Voir le message
    sous linux il n'y a pas de multibyte/unicode.

    elle vient d'ou cette bibliotheque gab_r?
    elle vient d'un autre module compilé au préalable.

  8. #8
    screetch
    Invité(e)
    Par défaut
    utilise nm pour lister les symboles de gab_r
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nm gab_r.so | grep GABObject
    si tu ne les trouve pas dedans, c'est que le problème intervient lors de la compilation de gab_r

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par screetch Voir le message
    utilise nm pour lister les symboles de gab_r
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nm gab_r.so | grep GABObject
    si tu ne les trouve pas dedans, c'est que le problème intervient lors de la compilation de gab_r
    merci screetch, mais j'ai déjà vérifié que les objets existent dans ladite librairie...
    ça doit être ailleurs! mais où??

  10. #10
    screetch
    Invité(e)
    Par défaut
    et tu n'as aucun autre fichier qui s'appelle libgab_r.a, ou libgab_r.so, etc etc (y compris dans un autre repertoire)?

  11. #11
    screetch
    Invité(e)
    Par défaut
    (accessoirement, si tu pouvais poster le resultat de nm libgab_r.so | grep GABObject quand meme...)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par screetch Voir le message
    (accessoirement, si tu pouvais poster le resultat de nm libgab_r.so | grep GABObject quand meme...)
    > nm libgab_r.so | grep GABObject
    84:000000000004aa64 t _GLOBAL__I__Z19ListClearAndDestroyPKcR10GABOrderedP9GABObject
    259:000000000004aa94 T _Z19ListClearAndDestroyPKcR10GABOrderedP9GABObject
    421:000000000005dff0 T _ZN13GABStoredFile15selectFirstThatEPFbPK9GABObjectPKvS4_S4_EPvS7_S7_b
    422:000000000005df00 T _ZN13GABStoredFile15SelectFirstThatEPFbPK9GABObjectPKvS4_S4_EPvS7_S7_b
    424:000000000005e338 T _ZN13GABStoredFile17GABAddClassDependEjPFvP9GABObjectPvjES2_
    427:000000000005e2a4 T _ZN13GABStoredFile20GABRemoveClassDependEjPFvP9GABObjectPvjE
    435:000000000005e030 T _ZN13GABStoredFile6SelectEPFbPK9GABObjectPKvS4_S4_EPvS7_S7_Pjb
    829:000000000005083e T _ZN17GABClassDependent17GABAddClassDependEjPFvP9GABObjectPvjES2_
    830:00000000000507aa T
    etc...

  13. #13
    screetch
    Invité(e)
    Par défaut
    alors je ne sais pas.

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par screetch Voir le message
    alors je ne sais pas.
    Le link peut échouer parce que les bibliothèques ne sont pas dans le bon ordre. Pour ne pas s'embarasser à chercher le bon ordre il faut instruire le linker de chercher jusqu'à ce qu'il trouve...

    De mémoire g++ -W( [les .o] -W)

    Sinon man g++ pour passer les paramètres au linker et man ld pour les dits paramètres.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par N i h i l Voir le message
    Le link peut échouer parce que les bibliothèques ne sont pas dans le bon ordre. Pour ne pas s'embarasser à chercher le bon ordre il faut instruire le linker de chercher jusqu'à ce qu'il trouve...

    De mémoire g++ -W( [les .o] -W)

    Sinon man g++ pour passer les paramètres au linker et man ld pour les dits paramètres.
    merci bcp mais là aussi j'ai bien vérifié que la lib en question est à la bonne place.
    Par contre, j'ai remarqué que cette erreur apparait quand je compile sans l'option -shared ! Qu'apporte cette option concrètement...ou plutôt qu'implique sur la compilation son utilisation ou non?

    En gros, quand je l'utilise, je n'ai pas ce genre de messages. Alors que pour mon problème, je compile sans cette option "shared"
    LINK.C = $(MKDIR) -p $(EDIR) ; $(COLINK) $(PURIFY) $(CCC) $(LDFLAGS) -shared -o $@

  16. #16
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Ces fonctions doivent être définies dans l'équivalent d'une DLL (un .a si je ne me trompe pas).
    Donc quand tu compiles avec l'option -shared (création d'un .a) il n'effectue pas le check des définitions de fonction (ce check sera effectué à l'exécution).
    Par contre quand tu compiles sans cette option, il fait ce check et ne trouve évidemment pas les définitions de fonction.
    Pour résoudre ce problème, il faut que tu recompiles la librairie qui contient les fonctions manquantes sans l'option -shared, afin que les définitions de fonction soient dans le .so et pas le .a .

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Ces fonctions doivent être définies dans l'équivalent d'une DLL (un .a si je ne me trompe pas).
    Perdu ;-) Les .a sont les librairies statiques, les .so sont les librairies dynamiques.

    Citation Envoyé par tchow Voir le message
    merci bcp mais là aussi j'ai bien vérifié que la lib en question est à la bonne place.
    Le problème est certainement dans le source :
    • La première erreur est
      src/AgentSupervision.C:109: référence indéfinie vers « GABError::GABError(short, char const*, char const*)
      et il n'y a pas de GABError::GABError dans libgab_r.so.
    • La seconde erreur est
      obj/AgentSupervisionImpl.o.data.rel.ro._ZTV20AgentSupervisionImpl[vtable for AgentSupervisionImpl]+0x68): référence indéfinie vers « GABObject::throwException(long, char const*, char const*) const»
      et libgab_r.so ne connaît que
      _ZNK9GABObject14throwExceptionEiPKcS1_ (càd
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      GABObject::throwException(int, char const*, char const*) const
      ).

  18. #18
    screetch
    Invité(e)
    Par défaut
    Toutes les fonctions manquantes ont ce problème effectivement: il semble que tu ne compiles pas avec les mêmes options
    toute les fonctions qui ne marchent pas ont un "long" ou "unsigned long" en argument
    peut être un #define long ou un truc moche comme ca?

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par N i h i l Voir le message
    Perdu ;-) Les .a sont les librairies statiques, les .so sont les librairies dynamiques.



    Le problème est certainement dans le source :
    • La première erreur est et il n'y a pas de GABError::GABError dans libgab_r.so.
    • La seconde erreur est et libgab_r.so ne connaît que
      _ZNK9GABObject14throwExceptionEiPKcS1_ (càd
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      GABObject::throwException(int, char const*, char const*) const
      ).
    oooh mais comment peut-on décoder que throwException (celle de la lib) requiert un int en argument? y a une terminologie pour comprendre ce que retourne nm?
    Merci d'avance de votre aide!

  20. #20
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tchow Voir le message
    oooh mais comment peut-on décoder que throwException (celle de la lib) requiert un int en argument? y a une terminologie pour comprendre ce que retourne nm?
    man nm ? man c++filt ?

    Cherche mangle/demangle...

Discussions similaires

  1. Problème de compilation wxwidgets sous Linux
    Par Zoloom dans le forum wxWidgets
    Réponses: 0
    Dernier message: 12/05/2008, 01h50
  2. Problêmes de compilation sous linux
    Par Micky_du_57 dans le forum GLUT
    Réponses: 4
    Dernier message: 25/05/2007, 20h37
  3. problème de compilation de code c sur linux
    Par bejaouijamil dans le forum C
    Réponses: 11
    Dernier message: 10/01/2007, 15h36
  4. Réponses: 7
    Dernier message: 10/11/2006, 14h33
  5. Réponses: 2
    Dernier message: 16/08/2006, 23h18

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