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 :

[Erreur] : définitions multiples de


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut [Erreur] : définitions multiples de
    Bonjour !

    Je suis en train de créer une bibliothèque pour la programmation Arduino.
    Cependant, je n'arrive pas à la compiler et ça fait quelques jours que je recherche cette erreur...

    led.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #ifndef __LED_H__
    #define __LED_H__
     
    #include "Arduino.h"
     
    class Led {
        public:
            Led(char pin, bool etat);
            ~Led();
     
            void changerEtat();
            void allumer();
            void eteindre();
     
            char getPin() const;
            void setPin(char pin);
     
            bool getEtat() const;
            void setEtat(bool etat);
     
        private:
            void mettreAJour();
            void preparerPin();
            void appliquerEtat();
     
            char m_pin;
            bool m_etat;
    };
     
    #endif
    led.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include "led.h"
     
    Led::Led(char pin, bool etat) {
        setPin(pin);
        setEtat(etat);
        mettreAJour();
    }
     
    void Led::changerEtat() {
        setEtat(1 - getEtat());
    }
     
    void Led::allumer() {
        setEtat(HIGH);
    }
     
    void Led::eteindre() {
        setEtat(LOW);
    }
     
    char Led::getPin() const {
        return m_pin;
    }
     
    void Led::setPin(char pin) {
        m_pin = pin;
        mettreAJour();
    }
     
    bool Led::getEtat() const {
        return m_etat;
    }
     
    void Led::setEtat(bool etat) {
        m_etat = etat;
        mettreAJour();
    }
     
    /* ######### PRIVATE ######### */
     
    void Led::mettreAJour() {
        preparerPin();
        appliquerEtat();
    }
     
    void Led::preparerPin() {
        pinMode(m_pin, OUTPUT);
    }
     
    void Led::appliquerEtat() {
        digitalWrite(m_pin, m_etat);
    }
    LIFINO.ino
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <led.h>
     
    Led led(13, LOW); //LOW = 1
     
    void setup() {}
     
    void loop() {
        led.changerEtat();
        delay(500);
    }
    Erreurs :

    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::getPin() const*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::getEtat() const*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::preparerPin()*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::appliquerEtat()*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::mettreAJour()*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::setPin(char)*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::setEtat(bool)*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::Led(char, bool)*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::Led(char, bool)*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::changerEtat()*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::allumer()*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*:
    /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::eteindre()*»
    led.cpp.o:led.cpp:49*: défini pour la première fois ici
    LIFINO.cpp.o*: Dans la fonction «*_GLOBAL__sub_D_led*»*:
    /usr/share/arduino/LIFINO.ino:3*: référence indéfinie vers «*Led::~Led()*»
    collect2: error: ld returned 1 exit status
    J'ai d'abord pensé à une erreur de directive préprocesseur, mais je n'ai rien trouvé de ce côté-ci...
    Merci beaucoup de l'attention !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    C'est comme si quelque part, tu incluais le .cpp au lieu du .h.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    éventuellement, ca peut arriver si le même .cpp est présent deux fois dans la liste des .cpp à compiler.
    Ca peut arriver avec un makefile tordu, par exemple

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    Je viens de trouver la raison; en fait, j'ai marqué dans LIFINO.ino :
    Donc ça va chercher le fichier dans les librairies de Arduino.
    Mais il n'a pas l'air d'aimer car led.h est dans le même fichier que LIFINO.ino...
    Il me suffit alors d'écrire à la place :
    Cela dit, je ne comprend pas pourquoi il relit les prototype; il y a quand même la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef __LED_H__
    #define __LED_H__
    [...]
    #endif
    Mais ça marche maintenant, merci de vos réponses !

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Le header-guard fonctionne très bien.
    Il ne sert qu'à éviter d'inclure plusieurs fois le même header lors de la COMPILATION d'un fichier source .cpp.
    Si vous compilez plusieurs .cpp, chacun inclura son "propre fichier header".
    C'est pour cela qu'on ne met que des déclarations dans un fichier d'en-tête et pas de définition.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ta conclusion colle difficilement à ton problème. Et ta solution encore moins.

    Le .h que tu montres plus haut ne contient que des déclarations et a un header guard. Ce fichier tel que présenté ici est tout à fait valide et ne génèrera aucune erreur.
    L'erreur de définition multiple est une erreur de link. Tout indique que le cpp est compilé plusieurs fois.
    L'erreur classique du débutant étant un include du fichier cpp.
    Ou une mauvaise condifuration qui entraîne la compilation du même fichier plusieurs fois.

    Et si tu regardes un peu l'erreur, tout indique que le problème se trouve dans LED::eteindre() LIFINO/led.cpp.o*: Dans la fonction «*Led::eteindre()*»*: /home/louis/sketchbook/libraries/LIFINO/led.cpp:49*: définitions multiples de «*Led::getPin() const*» led.cpp.o:led.cpp:49*: défini pour la première fois ici et la ligne 49 revient toujours.
    Sans compter la référence indéfinie vers «*Led::~Led().
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    Je n'avais pas très bien compris la méthode de l'IDE Arduino, c'est pour cela que j'ai fais une erreur.
    Cela dit, l'erreur concernant le constructeur n'a pas l'air fondée, et j'ai pensé à une indication erronée du compilateur...

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Non, ce n'est pas le constructeur dont il est question, mais le destructeur.
    Par contre, ton compilateur a toujours raison. S'il rapporte une erreur, c'est que ce que tu lui demandes est faux.
    Ca peut venir de la manière de lui demander (les options de compilations) ou du code à compiler.

    En l'occurence, il doit manquer la définition de ~Led()

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    Ah oui, effectivement !
    Ça y est, c'est corrigé :

    Merci !

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

Discussions similaires

  1. Erreur de définition multiple d'une variable
    Par SmileSoft dans le forum Débuter
    Réponses: 6
    Dernier message: 08/02/2013, 10h11
  2. Définition multiple
    Par Goundy dans le forum C
    Réponses: 7
    Dernier message: 02/04/2006, 18h59
  3. définition multiple
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 01/03/2006, 16h32
  4. [g++] Définitions multiples
    Par GLDavid dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/12/2005, 16h04
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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