Problème de compilation

Problème de compilation

by Simon Durussel -
Number of replies: 4

Bonsoir,

j'essaye de faire un des exercice du MOOC et lors de la compilation (que ça soit mon programme ou le corrigé) je reçois le message d'erreur suivant :

Undefined symbols for architecture x86_64: 

[des informations sur mes fonctions]

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ce n'est pas la première fois que j'ai un tel message d'erreur "undefined symbols..." et je me demandais à quoi cela était dû et comment corriger l(es)'erreur(s) correspondante(s).


In reply to Simon Durussel

Re: Problème de compilation

by Charlyne Christianne Hélene Bürki -

Bonsoir !

Le compilateur te dit qu'il est incapable de reconnaitre certains symbols car ils sont non-existants. N'aurais-tu par hasard pas oublié d'utiliser l'opérateur de résolution de portée dans tes fichier .cpp quand tu définis tes méthodes ? exemple Toupie::f(<whatever>) ?


In reply to Simon Durussel

Re: Problème de compilation

by Jean-Cédric Chappelier -

vous avez enlevé l'information la plus importante pour qu'on puisse pleinement vous répondre :

> [des informations sur mes fonctions]

Tout est là en fait !! ;-)
(écrire les messages d'erreur du compilateur n'est pas de la fraude ;-) )

In reply to Jean-Cédric Chappelier

Re: Problème de compilation

by Jean-Baptiste Camille Antoine-Marie Grillet -

Bonjour,

Je programme avec Geany sur Mac et rencontre le même problème avec mon fichier testVecteur.cc . Il compile mais lorsque je tente de construire le fichier testVecteur.o associé, j'obtiens l'erreur suivante :

Undefined symbols for architecture x86_64:
   "Vecteur::augmente(double)", referenced from:
       _main in testVecteur_9d85de.o
   "Vecteur:Vecteur(double, double, double)", referenced from:
       _main in testVecteur-9d85de.o

ld: symbol(s) not found for architecture x86_64
clang: error linker command failed with exit code 1 ( use -v to see invocation)
Compilation échouée.

Ce fichier testVecteur.cc (ci-dessous) fait appel à la méthode augmente() de la classe Vecteur et à l'un de ses constructeurs (comme le précise l'erreur) :

#include "Vecteur.h"

using namespace std;

int main() {

Vecteur vect1(1.0, 2.0, -0.1);

vect1.augmente(2.5);

return 0;

}


Quelques précisions : j'ai bien mis l'opérateur de résolution de portée dans la définition des méthodes du fichier Vecteur.cc ; mon binôme de projet ne rencontre pas cette erreur sur Windows...

J'ai vu que vous aviez fait allusion à la notion d' "édition de liens" dans une autre discussion, pourrait-il s'agir de cela ?

Merci beaucoup

JB Grillet

In reply to Jean-Baptiste Camille Antoine-Marie Grillet

Re: Problème de compilation

by Jean-Cédric Chappelier -
  1. il faut toujours se demander QUI vous donne l'erreur (compilation ou édition de liens).
    Pour cela il faut être au clair sur les concepts (revoir si nécessaire) : pour faire bref : compilation : .cc --> .o ; édition de liens : met tous les .o ensemble pour faire « le tout » (= l'exécutable).
    Ici donc  c'est ... <--- à compléter
  2. une fois qu'on sait QUI nous « insulte » il faut comprendre pourquoi : souvent c'est «« simplement »» comprendre l'anglais ésotérique qui est affiché.
    Ici c'est : il manque Vecteur::augmente(double)
    Ah ? pourquoi « il » nous dit que cela manque ?
    -> parce qu'« il » a raison (« il » a TOUJOURS raison ! ;-) )
  3. On remonte la piste jusqu'à la source du problème :
    si « il » a raison, c'est que je ne lui ai pas donné ce qu'«il» demande/attend .
    Ici : où dit on à « il » ce qu'«il » doit faire ?
    --> cela dépend du « il » au point numéro 1 (je vous laisse y répondre)
    mais une piste souvent utile est :
    compilation : dans un .h
    édition de lien : dans le Makefile
Après ça peut aussi être simplement parce que vous n'utilisez pas correctement votre outil (Geany) :
comment compilez vous dans Geany ? « à l'ancienne » (= compilation et édition de liens en une seule fois sur 1 seul fichier) ou  avec « make » ?
déjà mentionné dans ce post là : https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=29355#p59266