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 :

GCC sous Ubuntu et le linkage (undefined reference)


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut GCC sous Ubuntu et le linkage (undefined reference)
    Bonjour je relance un topic qui a déjé été abordé un bon millier de fois sur le net mais aucune des solutions proposées ne fonctionne chez moi...

    J'ai 3 libs maison compilées en statique : lib1.a, lib2.a et lib3.a et un programme qui linke ces 3 librairies, le tout sous Ubuntu 64bits.

    Le même code compile et linke sans problème sous MacOS. Sous Ubuntu ca compile sans problème en 64bits mais ca ne linke pas j'ai des undefined reference à chaque appel de fonction quasiment avec des trucs complètement dingue du style :
    lib1.a dans la fonction machin(), undefined reference vers la lib2.a, le tout pendant le linkage de mon programme principal.

    C'est du délire j'ai tout essayé : -static, changer l'ordre de linkage, ajouter -lstdc++ etc...

    Est-ce que quelqu'un à déjà rencontré ce problème ?

    J'ai installé gcc-multilib pour pouvoir compiler le même projet en 32bits plus tard, y aurait-il un rapport ?

    Merci à vous
    Tristan

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu as essayé de recompiler tes libs sous Ubuntu 64 bits avant de les linker à ton projet ? Car vu que le C++ ne propose pas d'ABI standardisée, ca peut foirer à pas grand chose (dès fois juste une option de compilation)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Salut oui j'ai nettoyé tout mes projets et tout recompilé, j'ai même du corriger certaines erreurs d'include car sous Ubuntu je ne retrouvais pas certains headers système et d'autres n'étaient pas inclus automatiquement... En tout cas j'ai bien mes fichiers .a disponibles...

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par esteban Voir le message
    Salut oui j'ai nettoyé tout mes projets et tout recompilé, j'ai même du corriger certaines erreurs d'include car sous Ubuntu je ne retrouvais pas certains headers système et d'autres n'étaient pas inclus automatiquement... En tout cas j'ai bien mes fichiers .a disponibles...
    Est-ce que tu pourrais poster les logs stp ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    En voici une partie (il y a plusieurs milliers de lignes comme ca).
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    PS aux autres posteurs : pas de flame war. On parle technique là, pas philosophie.

    Citation Envoyé par esteban Voir le message
    En voici une partie (il y a plusieurs milliers de lignes comme ca).
    C'est bizzare. Malheureusement, ces logs là sont peu utiles. Ce dont j'aurais besoin, ce sont les logs des moments ou les erreurs apparaissent, avec les lignes de commandes.

    1) génération des différentes librairies.
    2) génération de l'exécutable final.

    Tu peux changer les noms de fichiers si tu le désires. Je ne veux pas qu'on me taxe d'espionnage
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Ben en fait,

    la compilation des librairies se passe sans aucun message de warning ou d'erreur et les logs que j'ai mis sont ceux du linkage de l'exécutable... Je ne sais pas trop ce que je peux mettre d'autre ?

    Voici la ligne de commande pour 1 des libs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Building file: ../misc/misc.cpp
    Invoking: GCC C++ Compiler
    g++ -D__GNULINUX -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"misc/misc.d" -MT"misc/misc.d" -o"misc/misc.o" "../misc/misc.cpp"
    Finished building: ../misc/misc.cpp
     
    Building target: libhadop_foundation.a
    Invoking: GCC Archiver
    ar -r "libhadop_foundation.a"  ./Alarm.o ./Event.o ./FilterRule.o ./IpAddress.o ./MacAddress.o ./MacAddressDb.o ./Machine.o ./NetworkInterface.o ./Packet.o ./Sample.o ./Translator.o ./os_types.o ./sqlite3.o  ./misc/cipher.o ./misc/logger.o ./misc/md5.o ./misc/misc.o   
    ar: creating libhadop_foundation.a
    Finished building target: libhadop_foundation.a
    Et pour le linkage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    make all 
    g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.6.3/lib -o Achiwa AlertWindow.o main.o MainApp.o WarningWindow.o AboutWindow.o QtUtils.o Updater.o UpdateDialog.o UpdateDom.o DownloadDialog.o SerialValidator.o qtsingleapplication.o qtlocalpeer.o GuiWindow.o qt_globals.o moc_AlertWindow.o moc_MainApp.o moc_WarningWindow.o moc_AboutWindow.o moc_Updater.o moc_UpdateDialog.o moc_DownloadDialog.o moc_SerialValidator.o moc_qtsingleapplication.o moc_qtlocalpeer.o moc_GuiWindow.o qrc_AlertView.o qrc_AboutWindow.o qrc_UpdateDialog.o    -L/usr/local/Trolltech/Qt-4.6.3/lib -L/home/tristan/workspace/tinyxml/lib/ -L/home/tristan/workspace/hadop_foundation/Debug/ -L/home/tristan/workspace/hadop_data/Debug/ -L/home/tristan/workspace/hadop_net2/Debug/ -L/home/tristan/workspace/hadop_daemon/Debug/ -L/home/tristan/workspace/hadop_gui/Debug/ -lboost_thread-mt-sd -lboost_system-mt-sd -lboost_filesystem-mt-sd -lboost_regex-mt-sd -lboost_date_time-mt-sd -lboost_signals-mt-sd -lboost_iostreams-mt-d -lhadop_foundation -lhadop_data -lpcap -lpion-common -lhadop_net2 -lhadop_daemon -lhadop_gui -lssl -lcrypto -lz -lbz2 -lpion-net -lticppd -L/usr/local/Trolltech/Qt-4.6.3/lib -L/usr/X11R6/lib64 -lQtWebKit -lQtXmlPatterns -lQtNetwork -lstdc++ -lQtGui -lQtCore -lpthread
    Pour les messages d'erreur ce sont ceux que je t'ai filé et qui apparaissent dans le foulée du linkage.

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par esteban Voir le message
    Ben en fait,

    la compilation des librairies se passe sans aucun message de warning ou d'erreur et les logs que j'ai mis sont ceux du linkage de l'exécutable... Je ne sais pas trop ce que je peux mettre d'autre ?

    Voici la ligne de commande pour 1 des libs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Building file: ../misc/misc.cpp
    Invoking: GCC C++ Compiler
    g++ -D__GNULINUX -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"misc/misc.d" -MT"misc/misc.d" -o"misc/misc.o" "../misc/misc.cpp"
    Finished building: ../misc/misc.cpp
     
    Building target: libhadop_foundation.a
    Invoking: GCC Archiver
    ar -r "libhadop_foundation.a"  ./Alarm.o ./Event.o ./FilterRule.o ./IpAddress.o ./MacAddress.o ./MacAddressDb.o ./Machine.o ./NetworkInterface.o ./Packet.o ./Sample.o ./Translator.o ./os_types.o ./sqlite3.o  ./misc/cipher.o ./misc/logger.o ./misc/md5.o ./misc/misc.o   
    ar: creating libhadop_foundation.a
    Finished building target: libhadop_foundation.a
    Et pour le linkage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    make all 
    g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.6.3/lib -o Achiwa AlertWindow.o main.o MainApp.o WarningWindow.o AboutWindow.o QtUtils.o Updater.o UpdateDialog.o UpdateDom.o DownloadDialog.o SerialValidator.o qtsingleapplication.o qtlocalpeer.o GuiWindow.o qt_globals.o moc_AlertWindow.o moc_MainApp.o moc_WarningWindow.o moc_AboutWindow.o moc_Updater.o moc_UpdateDialog.o moc_DownloadDialog.o moc_SerialValidator.o moc_qtsingleapplication.o moc_qtlocalpeer.o moc_GuiWindow.o qrc_AlertView.o qrc_AboutWindow.o qrc_UpdateDialog.o    -L/usr/local/Trolltech/Qt-4.6.3/lib -L/home/tristan/workspace/tinyxml/lib/ -L/home/tristan/workspace/hadop_foundation/Debug/ -L/home/tristan/workspace/hadop_data/Debug/ -L/home/tristan/workspace/hadop_net2/Debug/ -L/home/tristan/workspace/hadop_daemon/Debug/ -L/home/tristan/workspace/hadop_gui/Debug/ -lboost_thread-mt-sd -lboost_system-mt-sd -lboost_filesystem-mt-sd -lboost_regex-mt-sd -lboost_date_time-mt-sd -lboost_signals-mt-sd -lboost_iostreams-mt-d -lhadop_foundation -lhadop_data -lpcap -lpion-common -lhadop_net2 -lhadop_daemon -lhadop_gui -lssl -lcrypto -lz -lbz2 -lpion-net -lticppd -L/usr/local/Trolltech/Qt-4.6.3/lib -L/usr/X11R6/lib64 -lQtWebKit -lQtXmlPatterns -lQtNetwork -lstdc++ -lQtGui -lQtCore -lpthread
    Pour les messages d'erreur ce sont ceux que je t'ai filé et qui apparaissent dans le foulée du linkage.
    Soit la ligne de link contient un -m64 parce que tu compiles en fait avec un compilateur 32 bits, et dans ce cas les lignes de build des fichiers .o doivent eux aussi contenir cette option, soit tu n'en a pas besoin parce que tu compiles avec un compilateur 64 bits.

    Que se passe-t-il si tu l'enlève ? Je dois avouer que je n'ai jamais réussi à utiliser correctement -m64 ou -m32. Options pénibles
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Alors je suis d'accord avec toi sur le problème de compiler/linker en 64.
    Je suis à peu près sur de tout compiler en 64 bits car les librairies tierces (Pion et boost en particulier) sont compilées uniquement en 64 bits, en plus le compilateur compile par défaut en 64 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tristan@tristan-ubuntu64-dev:~$ g++ -v
    Using built-in specs.
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
    Par contre une confusion a pu s'installer à cause du fait que j'ai commencé à recompiler certaines librairies en 32 bits (dans un autre répertoire) et que pour ce faire j'ai installé gcc-multilib et 2 ou 3 trucs qui étaient censés m'aider à faire la compilation en 32 bits...
    Je crois que je vais tout nettoyer et installer une autre VM pour compiler en 32 bits.
    Si jamais ca change quelque chose je vous dis.

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par esteban Voir le message
    Alors je suis d'accord avec toi sur le problème de compiler/linker en 64.
    Je suis à peu près sur de tout compiler en 64 bits car les librairies tierces (Pion et boost en particulier) sont compilées uniquement en 64 bits, en plus le compilateur compile par défaut en 64 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tristan@tristan-ubuntu64-dev:~$ g++ -v
    Using built-in specs.
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
    Par contre une confusion a pu s'installer à cause du fait que j'ai commencé à recompiler certaines librairies en 32 bits (dans un autre répertoire) et que pour ce faire j'ai installé gcc-multilib et 2 ou 3 trucs qui étaient censés m'aider à faire la compilation en 32 bits...
    Je crois que je vais tout nettoyer et installer une autre VM pour compiler en 32 bits.
    Si jamais ca change quelque chose je vous dis.
    C'est probablement la source de tous tes maux. C'est très ressemblant à des problèmes que j'avais moi-même rencontré (je voulais faire la compil 32 bits et 64 bits sur une unique machine. Pas bonne idée. Pas assez documenté).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Ben voilà j'ai tout supprimé, et j'ai remis l'options -m64 explicitement sur toutes les librairies et le programme... et toujours le même problème...

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Oh là là là là ! Que c'est compliqué !! C'est fou parce que je n'ai rencontré aucun de ces problèmes avec gcc sous Mac OS, pourquoi ??

    Voici les solutions à mes problèmes :
    -changer l'ordre des librairies (vu le nombre c'était vraiment sympa à faire)
    -ajouter la librairie dl

    Et voilà mon programme est compilé !
    Je m'en suis sorti mais je voudrais bien comprendre pourquoi c'est si compliqué sous Ubuntu ?

    Merci à tous ceux qui m'ont répondu !

  13. #13
    screetch
    Invité(e)
    Par défaut
    le linker (ld) est différent sous linux et sous macos

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    C'est une très bonne question

    Malheureusement, je crois que la réponse est très proche du laconique "Parce que!" lancé par Orangina Rouge.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/12/2012, 17h59
  2. Réponses: 3
    Dernier message: 14/04/2009, 10h24
  3. Problème de linkage mingw32 undefined reference
    Par nek_kro_kvlt dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/06/2007, 13h46
  4. [boso kernel] Assembleur inline GCC - Undefined Reference
    Par Edouard Kaiser dans le forum Programmation d'OS
    Réponses: 13
    Dernier message: 29/07/2005, 09h24

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