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 de compilation : "référence indéfinie"


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut Erreur de compilation : "référence indéfinie"
    Bonjour à toutes et tous,

    Je débute en C++ et je m'exerce en réalisant des petits scripts.
    Je voudrais étendre mes connaissances en tentant de maîtriser la POO... mais j'ai un peu de mal :-) .

    Je tombe sur une erreur classique de compilation qui, d'après ce que j'ai pu voir sur le net, peut être causé par différents types de choses, seulement je n'ai pas trouvé de solution adaptée à mon cas.

    Je souhaite utiliser un objet Panier dans ma fonction "main", j'ai créé une classe Panier avec un fichier en tête en ".h" et le fichier de fonction en ".cpp".

    Le fichier "main.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
    #include <iostream>
    #include <istream>
     
    using namespace std;
     
    #include "Panier.h"
     
    int main() {
     
        Panier panier;
     
        cout << "Total du panier : " << panier.getTotal() << endl;
     
        return 0;
    }
    Le fichier "Panier.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
    #ifndef PANIER_H
    #define PANIER_H
     
    using namespace std;
     
    #include "Panier.cpp"
     
    class Panier
    {
    private:
        double sub_total;
        double vat;
        double total;
     
        int count;
     
    public:
     
        double getSubtotal();
        double getVat();
        double getTotal();
     
    };
    #endif
    Le fichier Panier.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
    #include <iostream>
     
    using namespace std;
     
    double sub_total = 0;
    double vat = 0;
    double total = 0;
     
    double getSubtotal() {
     
        return sub_total;
     
    }
     
    double getVat() {
     
        return vat;
     
    }
     
    double getTotal() {
     
        return total;
     
    }
    Je compile sous Unbuntu avec GCC, voici la ligne de commande exécutée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ main.cpp -std=c++14 -Wall -Wextra -o main
    Voici les détails de l'erreur de compilation :
    /tmp/ccd4J1Yo.o *: Dans la fonction « main » :
    main.cpp:(.text+0xbea): référence indéfinie vers « Panier::getTotal() »
    collect2: error: ld returned 1 exit status
    Je précise que la compilation ne pète pas si je ne fais pas panier.getTotal().

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    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 153
    Billets dans le blog
    4
    Par défaut
    Panier.cpp n'est pas compilé.
    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.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Attention après avoir ajouté à la ligne de compilation le fichier Panier.cpp, il y aura toujours le problème car la fonction définie dans ce fichier est la fonction globale double getTotal() alors que l'on attend une fonction membre de panier double Panier::getTotal().

  4. #4
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Merci pour vos réponses,

    En fait j'ai déjà étudié l'hypothèse du fichier non compilé... hors "Panier.cpp" doit être compilé puisque si j'appelle getSubtotal() ou getTotal() en direct comme des fonctions et non pas à travers un objet instance d'une classe ça fonctionne.

    J'ai quand même voulu écarter cette hypothèse en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ *.cpp -std=c++14 -Wall -Wextra -o main
    et en ajoutant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ Panier.cpp -std=c++14 -Wall -Wextra -o panier
    Cela n'a pas réglé mon problème.

    Du coup, j'ai essayé d'ajouter Panier:: devant chaque méthodes, cette fois je n'ai plus l'erreur initiale mais j'ai une autre erreur (ou plutôt 3 du même type) :
    Panier.cpp:10:5: error: ‘Panier’ has not been declared
     int Panier::getSubtotal() {
         ^~~~~~
    Panier.cpp:16:5: error: ‘Panier’ has not been declared
     int Panier::getVat() {
         ^~~~~~
    Panier.cpp:22:5: error: ‘Panier’ has not been declared
     int Panier::getTotal() {

    J'ai également essayé de changé le type retourné mais en vain.

    J'ai ré-épluché différents tutos... je ne vois vraiment pas où est le problème.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    L'erreur te dit qu'il ne sait pas ce qu'est Panier dans le fichier Panier.cpp
    En effet il n'y a pas l'include de Panier.h qui défini Panier dans le fichier Panier.cpp

  6. #6
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Désolé, je n'ai pas mi à jour les sources, en fait si, il y a bien un include de "Panier.h"

    Voici le code à jour du fichier Panier.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
     
    #include "Panier.h"
    #include <iostream>
     
    using namespace std;
     
    double sub_total = 0.0;
    double vat = 0.0;
    double total = 0.0;
     
    int Panier::getSubtotal() {
     
        return 0;
     
    }
     
    int Panier::getVat() {
     
        return 0;
     
    }
     
    int Panier::getTotal() {
     
        return 0;
     
    }
    Je n'ai pas cette erreur si je ne fait pas d'#include "Panier.cpp" dans "Panier.h", par contre je me retrouve avec l'erreur initiale "référence indéfinie vers..."
    Je pense que je n'arriverai pas à solutionner mon problème tant que je n'aurai pas compris comment fonctionne les includes... qui appel qui... ?? est ce qu'il faut d'abord inclure le ".cpp" ou le ".h" ??

    Merci d'avance pour vos lumière !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/10/2008, 14h29
  2. Problème de compilation: Référence indéfinies
    Par richard_sraing dans le forum C++
    Réponses: 4
    Dernier message: 05/07/2007, 10h49

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