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

Langage C++ Discussion :

erreur de link avec g++ pour 32bits


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Par défaut erreur de link avec g++ pour 32bits
    Bonjour a tous,

    j'ai un code c++ que je compilais il y a quelque temps sans problème sur ubuntu 32 bits avec la commande make (qui executait des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall fichier.cpp -o fichier.o
    et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ld --oformat binary -Ttext 1000 list_de_fichier -o exec
    ).

    J'aimerais maintenant pouvoir le compiler sur mac os 64bits, toujours avec un makefile pour le moment, et g++, donc j'ai essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -m32 fichier.cpp -o fichier.o
    et toujour la meme commande pour linker les fichier
    mais j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Underfined sumbols for archtecture i386 : 
    "mafonction()", referenced from _main in ccar89r1.o
    Je n'utilise aucune libraire dans mon code, je n’inclus que quelques fichiers d'en-tête...

    Quelqu'un sait d'ou pourrait venir cette erreur, et surtout comment la résoudre?

    merdi d'avance

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Salut,

    Je commencerais déjà par voir à quoi correspond la fonction en question.

    Tu dis que tu n'utilises aucune bibliothèque dans ton code, mais, dés le moment où tu inclus un fichier extérieur à ton projet, on peut décemment imaginer qu'il y a bel et bien une bibliothèque externe qui entre en oeuvre

    "Globalement", un symbole indéfini survient dans deux cas méritant des approches distinctes:
    1. Soit le symbole correspond à une fonction issue de ton projet
    2. Soit le symbole correspond à une fonction issue d'une bibliothèque externe
    Dans le cas d'une fonction issue de ton projet, il y a plusieurs raisons possibles :
    1. L'implémentation de la fonction en question a été supprimée ou commentée
    2. Le fichier dans lequel se trouve la fonction a été supprimé ou déplacé
    3. Le fichier objet contenant le code binaire de la fonction n'est pas pris en compte lors de l'édition de lien

    Il faut donc commencer par s'assurer que l'implémentation de la fonction existe bel et bien dans le code, qu'elle n'a pas été mise en commentaire, et que le fichier d'implémentation se trouve au bon endroit dans l'arbre de fichiers (s'il a été ne serait ce que déplacé de <source>/ truc à <source> / truc / bidule, ca peut expliquer le problème )

    Si l'implémentation de la fonction existe bel et bien, il faut s'assurer que le fichier la contenant est bel et bien compilé, et qu'il se trouve à la bonne place (tu devrais normalement trouver dans le répertoire de compilation un fichier portant le meme nom, mais portant l'extension *.o )

    Si le fichier objet existe bel et bien, il faut s'assurer qu'il est bien pris en compte par l'éditeur de liens, et que le bon chemin d'accès est utilisé.

    Si la fonction manquante ne fait pas partie de ton code, c'est, très clairement, qu'elle est issue d'une bibliothèque externe.

    Dans ce cas, les raisons possibles pour lesquelles l'éditeur de liens ne la trouverait pas sont :
    • Le fait que tu n'aies pas indiqué qu'il fallait utiliser la bibliothèque en question (il se peut qu'elle ait été prise en compte par défaut sur ubuntu, et ne pas l'être sur ton nouveau système )
    • Le fait que l'éditeur de liens ne trouve pas la bibliothèque en question
    • Le fait que tu travailles avec une version différente de la bibliothèque, et que la fonction en question a été rajoutée ou rendue obsolète entre les deux versions
    Les deux premiers cas ne se limiteraient sans doute pas à indiquer une seule erreur de symbole non définis, mais se feraient un énorme plaisir de lister toutes les fonctions de la bibliothèque externe que tu aurais utilisées

    De plus, la première erreur du deuxième cas serait du genre de "library XXX not found"

    Vérifie quand meme la présence de la bibliothèque en question sur ton nouveau système, et, au besoin installe la.


    Vérifies aussi que la variable LDFLAGS fournisse bien le bon chemin d'accès à cette bibliothèque, et modifie ton makefile le cas échéant (on ne peut en effet pas jurer que la bibliothèque se trouve forcément dans le meme dossier sur les deux systèmes)

    Si tu obtiens la certitude que la bibliothèque est présente sur ton système et qu'elle est accessible par l'éditeur de liens, vérifies en la version et, au besoin, installe la meme version que celle que tu as sur ubuntu (en corrigeant au besoin ton makefile)

    A défaut de plus d'info, il nous sera difficile de te donner une réponse beaucoup plus précise

    Hope it helps
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Par défaut
    C'est ce qui s'appelle une réponse plus que précise :p

    Enfait j'ai un fichier "principal.cpp" dans lequel j’inclus "screen.h" qui contient l'en-tête de la fonction "print(char*, color, color)" contenu dans le fichier "screen.cpp". Lorsque je disais
    Je n'utilise aucune libraire dans mon code, je n’inclus que quelques fichiers d'en-tête...
    je voulais dire que je n'inclu aucune bibliotheque, ca fait deja 3 possibilité en moins :p

    Ensuite, dans mon Makefile, j'utilise ceci pour compiler tous mes fichiers d'un coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %.o : %.cpp
         $(CPP) $(CXXFLAGS) $^ -o $@
    Et ceci pour llinker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec: principal.o screen.o
         ld --oformat binary -Ttxt 1000 $^ -o $@
    Je me demandais si, déjà, "%.o : %.cpp" fonctionnais bien, je m'explique :

    Lorsque je fait comme decrit precedemment, dans le terminal je voit la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -m32 principal.cpp -o kernel.o
    suivit de l'erreur expliquer dans mon premier post...

    Mais si je fait ceci dans mon Makefile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .o : .cpp
          $(CPP) $(CXXFLAGS) $^ -o $@
    Je vois ceci dans le terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ -Wall -m32   -c -o principal.o principal.cpp
    g++ -Wall -m32   -c -o screen.o screen.cpp
    ccrMZek7.s:655:FATAL:Symbol next already defined.
    Ce qui veut dire qu'il compile bien principal.cpp mais qu'il bloque pour screen.cpp, or je croit savoir que la deuxieme ecriture est juste un peu plus ancienne mais est sencer faire pareil non?

    Finalement, je ne sais pas si c'est une erreur de compilation, de makefile ou de linkage... Une idée?

    Si tu as encore besoin de précision n’hésite pas, et encore merci pour ta précédente reponse

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Par défaut
    Personne ne peut m'aider? Ne fusse que pour me dire ou est ce que j'ai plus de chance de trouver une réponse?

  5. #5
    screetch
    Invité(e)
    Par défaut
    tes deux regles de compilation sont fausses:

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %.o : %.cpp
         $(CPP) $(CXXFLAGS) $^ -o $@
    il manque le flag -c pour dire que l'on compile un seul fichier et donc de ne pas faire le link; a l'heure actuelle, ta ligne de commande demande de compiler le fichier et démettre un executable (donc de faire le linking)

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .o : .cpp
          $(CPP) $(CXXFLAGS) $^ -o $@
    la syntaxe est mauvaise, la facon "old school" d'ecrire ca c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .cpp.o:
          $(CPP) $(CXXFLAGS) $^ -o $@
    (oublie pas le -c dans ce cas la non plus)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 20
    Par défaut
    Cela me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g++ -m32 -Wall -c screen.cpp -o screen.o
    cc7Cu3xp.s:655:FATAL:Symbol next already defined.
    (Il a bien compiler principal.cpp)

    Une autre solution? Besoin d'autre précision?

    Merci de ta réponse, tu me redonne de l’espoir

Discussions similaires

  1. Erreur de link avec surcharge operator
    Par Dani3L dans le forum C++
    Réponses: 4
    Dernier message: 16/07/2008, 21h43
  2. Erreur de link avec Gcc + QThread
    Par uriotcea dans le forum Débuter
    Réponses: 1
    Dernier message: 22/05/2008, 15h13
  3. [STL] Erreur au link avec VC++ et Pocket PC 2003
    Par Slayne dans le forum Mobiles
    Réponses: 2
    Dernier message: 24/08/2007, 11h45
  4. Erreur de link avec les templates
    Par suiss007 dans le forum C++
    Réponses: 6
    Dernier message: 04/01/2007, 11h09
  5. Erreurs de link avec fenêtres win32
    Par crossbowman dans le forum Windows
    Réponses: 4
    Dernier message: 21/02/2006, 01h08

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