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 504
    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 504
    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