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 :

Référence indéfinie - Linux


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Par défaut Référence indéfinie - Linux
    Bonjour,
    Je précise que mon système d'exploitation est Linux Ubuntu 16.04 LTS. Mon nom d'utilisateur est mathisfrompc.
    Je suis tout nouveau sur le site "Developpez.com" . Veuillez m'excuser si ce forum et son titre ne respectent pas les règles de mise en page.
    J'ai 14 ans et je débute dans le langage C++. Je vous prie d'être indulgents envers moi si j'ai commis une faute stupide.

    J'ai fait un petit programme qui calcule la moyenne de 5 nombres.Voici ce que jais écris dans 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
     
    #include <iostream>
    #include <vector>
    #include "moyenne.h"
    using namespace std;
     
    int main ()
    {
    	double moy;
    	moy = moyenne();
    	cout << "la moyenne est de " << moy << endl;
     
    	return 0;
    }
    En suite,comme vous l'avez vu dans le code j'ai fait une fonction dans un autre fichier qui est celle qui calcule vraiment la moyenne.voici son contenu (du fichier moyenne.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
     
    #include <iostream>
     
    using namespace std;
    double moyenne()
    {
        int const tailleTableau = 5;
        double tableautest [tailleTableau];
        cout << "Ceci est une machine a calculer une moyenne!" << endl << "Entrez 5 nombres" << endl;
        cin >>tableautest[0];
        cout << endl;
        cin >>tableautest[1];
        cout << endl;
        cin >>tableautest[2];
        cout << endl;
        cin >>tableautest[3];
        cout << endl;
        cin >>tableautest[4];
        cout << endl;
     
        double moyenne = 0;
        for (int i=0; i<tailleTableau;i++)
        {
            moyenne += tableautest[i];
        }
        moyenne /= tailleTableau;
        return moyenne;
    }
    Et voici ce qu'il y a dans le fichier " moyenne.h " :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef MOYENNE_H_INCLUDED
    #define MOYENNE_H_INCLUDED
     
    //calcule la moyenne de 5 nombres
    double moyenne();
     
    #endif // MOYENNE_H_INCLUDED
    Tous ces fichiers ( main.cpp , moyenne.cpp et moyenne.h ) sont dans le même dossier nommé "moyenne-prog" (il y a aussi " main.o " ) situé dans mon dossier personnel.
    Comme j'ai une problème (assez complexe et qui n'est pas le sujet de ce forum) entre mon EDI et mon compilateur, je compile mon programme par des commandes du terminal. Je n'y connais rien au bash, c'est un ami qui m'a juste donné les commandes. Voici les commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mathisfrompc@mathisfrompc-GA-MA69GM-S2H:~$ cd moyenne-prog
     
    mathisfrompc@mathisfrompc-GA-MA69GM-S2H:~/moyenne-prog$ g++ -c main.cpp
     
    mathisfrompc@mathisfrompc-GA-MA69GM-S2H:~/moyenne-prog$ g++ main.o -o moyenne
    A partir de la, le terminal affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    main.o : Dans la fonction « main » :
    main.cpp: (.text+0x9) : référence indéfinie vers « moyenne() »
    collect2: error: ld returned 1 exit status

    Je ne comprends absolument pas ce que cela veut dire. Est-ce une erreur dans mon programme ou autres?
    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    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 470
    Par défaut
    Réparez votre IDE, ça sera bien plus simple pour vous.

    Le message d'erreur est une erreur d'édition de lien, pas une erreur de compilation.
    Il gueule parce que "main.o" utilise la fonction "moyenne" et que son code "object" (le .o) est nulle part.
    Vous devez compiler aussi "moyenne.cpp" pour avoir un "moyenne.o" et fournir ce "moyenne.o" au linker en même temps de "main.o".

    Je vous laisse potasser la documentation de g++.

    Mais je pense que la lecture de cette documentation sera bien plus longue que la remise en fonctionnement de votre IDE.

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Je vous laisse potasser la documentation de g++.
    Boah, t'es dur.. De ce qu'il nous dit, l'OP est collégien, son message est bien rédigé, les infos sont présentes, il travaille dans un environnement adéquat pour l'apprentissage (i.e.: pas sous Visual Shit 201X). On pourrait discuter de la pertinence du choix du C++ comme premier langage à 14 ans mais on lui a probablement « conseillé », bref qu'importe. Il mérite qu'on adapte le message.


    Citation Envoyé par mathisfrompc Voir le message
    je compile mon programme par des commandes du terminal. Je n'y connais rien au bash, c'est un ami qui m'a juste donné les commandes.
    C'est une excellente méthode pour débuter.

    Les commandes que tu entres ne sont pas spécifiques au shell (bash) mais au modèle de compilation C (et C++). Ce que tu fais c'est invoquer manuellement le compilateur sur chacun de tes fichiers source (.cpp), afin de les traduire en autant de fichiers objet (.o). Afin d'obtenir un fichier exécutable (sans extension spécifique sous Unix, .exe sous Windows), cela ne suffit pas : il convient ensuite d'invoquer un éditeur de lien afin de lier l'ensemble des fichiers objets obtenus.

    Je te conseille de rechercher la définition de chacune des expressions que j'ai formaté en gras ci-dessus afin de te familiariser avec le modèle de compilation.

    Pour simplifier très grossièrement : lorsque tu écris du code dans dudule.cpp, il va être traduit en langage machine par le compilateur dans le dudule.o correspondant. Afin que le reste du programme « voit » les fonctions définies dans le module dudule et vice-versa, il convient ensuite de lier les fichiers objets ensemble à l'aide d'un programme dédié. Dans ton cas précis, la fonction main() ne « voit » pas la fonction moyenne() puisque tu n'as pas compilé ni lié le code issu de moyenne.cpp, sans lequel le programme est incomplet.

    Tes commandes de build devraient donc être les suivantes (ne pas saisir le $ initial) :

    • $ g++ -std=c++14 -pedantic -Wall -Wextra -c main.cpp moyenne.cpp pour compiler (l'option -c exécute uniquement la phase de compilation) en C++14 avec tous les warnings activés, puis si la compilation a réussi :
    • $ g++ main.o moyenne.o -o moyenne pour lier les fichiers objets. Enfin :
    • $ ./moyenne pour démarrer le programme.

    Pour des projets plus complexes, on utilise des outils de plus haut niveau afin d'automatiser la construction de l'exécutable. C'est hors de propos ici mais garde en tête que ça existe lorsque tu progresseras. Ton IDE fait la même chose sous le capot.


    Citation Envoyé par bacelar Voir le message
    Réparez votre IDE, ça sera bien plus simple pour vous.
    Non. Les IDE sont pour les professionnels qui savent programmer. Ce jeune homme a l'occasion d'apprendre comment les choses se déroulent réellement, ne lui refusons pas cette chance.

  4. #4
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Par défaut Merci !
    Merci pour tous vos conseils. J'ai appris pas mal de choses sur la compilation et tout le reste grâce à vous. J'ai effectivement réglé le problème en faisant ce que vous m'avez conseillé. Vous êtes top!

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

Discussions similaires

  1. 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
  2. Problème de référence indéfinie
    Par skyangel dans le forum C++
    Réponses: 1
    Dernier message: 28/03/2007, 16h53
  3. Pb référence indéfinie
    Par Euseibus dans le forum Autres éditeurs
    Réponses: 13
    Dernier message: 19/02/2007, 15h35
  4. Réponses: 10
    Dernier message: 02/01/2007, 12h07
  5. [Linker MinGW]Références indéfinies mais libs incluses
    Par oiffrig dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 31/08/2006, 13h35

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