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: multiple definition


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut problême de compilation: multiple definition
    Bonjour,

    J'utilise Dev C++ et en voulant compiler mon programme (pas encore fignolé) le compilateur (après quelques autres tentatives et résolutions d'erreurs de débutants) me met très exactement:

    multiple definition of 'choix_1'
    first define here
    Id returned 1 exit status
    <adresse de makefile.win> [Built Error] ["Sudoku]Error1

    Je me demande pourquoi il me dit first define here sans numéro de ligne déjà, mais après avoir changé le nom à 2 endroits seulement (la définition et l'appel), la compilation plante encore pour la même raison (mais avec le nom de la fonction changé!). Si c'est une erreur syntaxique, voici les utilisation du nom de la fonction et le #include du fichier concerné, aussi j'ai utilisé le #define comme écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include"choix_un_NbrGrillesMax.cpp"
    choix_1();
     
    //dans le fichier concerné
    #ifndef untruk  //pour éviter justement toute déclaration multiple
    #define untruk
     
    void choix_1()
    {
             // définition de la fonction
    }
     
     
    #endif
    Cette erreur me paraît encore plus incompréhensible du fait lorsque je déclare la fonction dans le fichier main.cpp en gardant le même nom, la compilation se passe sans problême. Cela m'a fais croire à une erreur simple et qu'il fallait malgrès l'include déclarer la fonction (ce qui n'est pas très logique si on se tient au fait que le compilateur a déjà lus la définition de la fonction) et si je change une ligne (car le code n'est pas parfait au début pour le menu) et que je remets à compiler, il me remet exactement la même erreur, quoique justifiée maintenant, et si j'efface la déclaration en trop, l'erreur reste.
    Aussi lorsque j'ai commencé à coder ce programme, cette fonction était non pas void mais int, et après avoir changé, en allant dans le gestionnaire des fonctions, variables et structures-classes, je me rends compte que le compilateur reconnait encore la fonction comme renvoyant un int, et me signale pour cela une erreur car la fonction n'a pas de variable où renvoyer la valeur de la fonction... Après je ne sais plus quelles manipulations, j'ai réussi à effacer ce double fantôme.
    Enfin au début du codage, j'avais utilisé un fichier entête pour main, mais comme main en elle-même n'avait pas beaucoup de variables (une) et n'était qu'un menu, j'ai enlevé l'include et le fichie du projet, en déclarant la variable dans main.cpp donc. Quelle n'est pas ma surprise de voir qu'il y a une déclaration éxédentaire de la variable! Le compilateur continuait à inclure le fichier entête malgrès que je l'eus supprimer du projet et qu'il n'y avait aucune utilisation. Le fichier en question était resté dans le répertoire où j'avais rangé le programme, et il était intacte, et le compilateur s'en servait et le reconnaisait. Ce n'est qu'en le supprimant de l'ordinateur (sans passer par la corbeille) que j'ai pus avoir la paix.

    Je vous assure que je n'invente rien, et que tout ceci (qui ressemble à un film d'angoisse) est vrai et s'est passé! Est-ce Dev C++ le problême? Est-ce un oubli ou une erreur syntaxique de ma part? Sont-ce des fantômes de la machine qui hantent mon pc?

    La suite au prochain épisode (ce n'est toujours pas une invention de ma part!)

    P.S. : ce programme doit servir à calculer le nombre de grilles de sudoku possibles, avoir une idée de l'ordre de grandeur pour voir, car même si on peut se dire qu'il y en a infiniment, il n'empêche que les obstacles s'imposant rendent difficile l'éciture d'une seule grille par un humain, d'où l'utilité du calcul de masse, bien bourrin.
    Aussi je suis débutant (encore et toujours à lire des tutos et ce que je trouve depuis 1 an) et mes programmes ont un facheuse tendance à ne jamais réussir à la première compilation et à me laisser tout bête pendant une semaine au moins. Alors je ne serais pas étonné si ce n'est qu'un point virgule ou une bêtise de ce genre... -_-

    P.P.S. : Désolé pour la taille du message mais le problême vaut bien ça.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Désolé, je lis en travers, d'abord.
    Un .cpp n'est pas fait pour être inclus. Du coup, si tu inclues ta définition plusieurs fois, c'est normal que cela plante. En fait tu t'y prend un peu à l'envers.
    Note au passage, ta déclaration n'est pas correcte, il manque le void à la signature. De là à ce que ce soit lié.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    1. Une fonction non-template et non-inline n'est pas supposée être inclue. C'est ce qui donne une erreur d'édition de liens.
    2. En règle générale, les gardes d'inclusion de fichiers d'en-tête peuvent empêcher des erreurs de compilation, mais n'ont généralement rien à voir avec les erreurs d'édition de liens.
    3. Solution: Soit tu gardes une fonction non-inline et tu la mets dans un fichier .cpp, déclarée dans un fichier .h, et tu inclues le .h et non le .cpp, soit tu fais une fonction inline dans un fichier .h.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Erreur de compilation "multiple definition of"
    Par cereal dans le forum Débuter
    Réponses: 3
    Dernier message: 22/02/2010, 17h29
  2. Réponses: 27
    Dernier message: 26/03/2008, 08h06
  3. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  4. Réponses: 1
    Dernier message: 27/05/2002, 01h44
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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