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

Code::Blocks Discussion :

Undefined reference to : erreur de lien ?


Sujet :

Code::Blocks

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Undefined reference to : erreur de lien ?
    Bonjour,
    Je ne parviens pas à faire en sorte que mon main reconnaisse les appels à la classe V3.
    Voici mon code:

    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
    #include <iostream>
    #include "V3.hpp"
     
    using namespace std;
     
    int main()
    {
        V3 u(2.1,5.3,6.4);
        cout << u << endl;
        V3 v;
        cout << u << endl;
        return 0;
    }
    V3.hpp:
    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
    #ifndef V3_HPP_INCLUDED
    #define V3_HPP_INCLUDED
     
    #include <iostream>
     
    class V3
    {
        private:
            float x;
            float y;
            float z;
        public:
            V3();
            V3(float _x, float _y, float _z);
            V3(const V3& v);
            virtual ~V3();
            V3& operator=(const V3& v);
            V3& operator+(const V3& v);
            float getX();
            float getY();
            float getZ();
            void setX(float _x);
            void setY(float _y);
            void setZ(float _z);
            V3& operator+=(const V3& v);
            bool isNull();
    };
     
    bool operator==(const V3& u, const V3& v);
    float operator%(const V3& u, const V3& v);
    V3 operator^ (const V3& u, const V3& v);
    bool operator||(const V3& u, const V3& v);
    std::ostream& operator<<(std::ostream& os, const V3& v);
    #endif // V3_HPP_INCLUDED
    V3.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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    #include "V3.hpp"
    using namespace std;
     
    V3::V3()
    {
        this->x = 0;
        this->y = 0;
        this->z = 0;
    }
    V3::V3(float _x, float _y, float _z): this->x(_x), this->y(_y), this->z(_z)
    {}
    V3::V3(const V3& v)
    {
        this->x = v.x;
        this->y = v.y;
        this->z = v.z;
    }
    V3::~V3()
    {}
    V3& V3::operator=(const V3& v)
    {
        this->x = v.x;
        this->y = v.y;
        this->z = v.z;
        return *this;
    }
    V3& V3::operator+(const V3& v)
    {
        this->x += v.x;
        this->y += v.y;
        this->z += v.z;
        return *this;
    }
     
    V3& V3::operator+=(const V3& u)
    {
        (*this) = (*this)+u;
        return *this;
    }
     
    float V3::getX()
    {
        return this->x;
    }
     
    float V3::getY()
    {
        return this->y;
    }
     
    float V3::getZ()
    {
        return this->z;
    }
     
    void V3::setX(float _x)
    {
        this->x = _x;
    }
     
    void V3::setY(float _y)
    {
        this->y = _y;
    }
     
    void V3::setZ(float _z)
    {
        this->z = _z;
    }
     
    bool V3::isNull()
    {
        return (this->x==0 && this->y==0 && this->z==0);
    }
     
    bool operator==(const V3& u, const V3& v)
    {
        return (u.getX() == v.getX() && u.getY() == v.getY()
                && u.getZ() == v.getZ());
    }
     
    float operator%(const V3& u, const V3& v)
    {
        return (u.getX()*v.getX() + u.getY()*v.getY() + u.getZ()*v.getZ());
    }
     
    V3 operator^(const V3& u, const V3& v)
    {
        V3 w;
        w.setX(u.getY()*v.getZ() - u.getZ()*v.getY());
        w.setY(u.getX()*v.getZ() - u.getZ()*v.getX());
        w.setZ(u.getX()*v.getY() - u.getX()*v.getY());
        return w;
    }
     
    bool operator||(const V3& u, const V3& v)
    {
        return (u^v).isNull();
    }
     
    ostream& operator<<(ostream& os, const V3& v)
    {
        os << "Vecteur:" << endl << "x: " << v.getX() << endl << "y: " << v.getY() << endl << "z: " << z.getZ() << endl;
        return os;
    }
    Je reçoit autant d'erreurs 'undefined reference to' que j'ai d'appels à la classe V3 dans le main.
    J'ai déja eu cette erreur auparavant, elle s'était résolue en mettant tout le code de V3 dans V3.cpp sans passer par un header, cela fonctionnait je ne sais pourquoi.

    Je vous remercie d'avance pour toute réponse.
    Ben

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,

    Lorsqu'on se donne la peine de corriger les nombreuses fautes de syntaxe, ça finit par compiler sans problème :

    1) les fonction operator ==, %, ^, ||, << doivent être déclarées comme fonctions amies d la classe V3, si non elles ne peuvent pas accéder aux membres privés de V3

    2)les fonctions membres getX, getY, et getZ ne modifient pas l'objet, elles doivent donc être déclarées constantes : ça leur permet de pouvoir etre utilisées avec des objets constants. Si tu oublie de le faire, un appel à "bool operator==(const V3& u, const V3& v)", par exemple, est refusé car v et u sont déclarés constants.

    3) Il te reste une faute de frappe à trouver tout seul...

    Une fois que ça compilera, il te restera à tester le fonctionnement de toutes les fonctions définies dans "V3.cpp"

    Il faut que tu révises les fonction amies des classes et les fonctions membres constantes

    PS : plutôt que d'écrire "#ifndef V3_HPP_INCLUDED" préfère "#ifndef V3_HPP" : on sait que c'est un include de toute façon, puique c'est un *.hpp ou un *.h

    PS2 : Attention avec l'opérateur == sur des types "réels" : voir ce post

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci pour ces indications, cependant j'ai l'impression que ces erreurs ne sont pas à l'origine des erreurs 'undefined reference to', en tout cas en ce qui concerne l'appel au constructeur. Il est prévu que je révise toutes ces notions .

    Merci pour ta réponse.
    Ben

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Une fois ces erreurs corrigées, ça a compilé sans problèmes ( je suis sous VS2008 )

    J'ai réessayé de compiler ton code ( avant corrections ) et je n'ai pas de 'undefined reference to'... seulement les erreurs dues au fautes de syntaxes

    Citation Envoyé par ben.p Voir le message
    J'ai déja eu cette erreur auparavant, elle s'était résolue en mettant tout le code de V3 dans V3.cpp sans passer par un header, cela fonctionnait je ne sais pourquoi.
    Sans vouloir trop insister, j'ai du mal à le croire!

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Une autre erreur à corriger :
    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V3::V3(float _x, float _y, float _z): this->x(_x), this->y(_y), this->z(_z)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V3::V3(float _x, float _y, float _z): x(_x), y(_y), z(_z)
    Il faut aussi éviter les noms commençant par _ ( ça peut porter à confusion avec des noms utilisés par le compilo -> recherche de bugs plus difficile )

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Il faut simplement compiler et lier les 2 fichiers pour produire l'exécutable. Qu'utilises-tu pour développer ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Bonsoir,

    Merci bertry pour ces indications, j'ai effectué les changements en question mais je rencontre toujours les même erreurs sous Code::Blocks. Merci Archi3D pour ta réponse également.

    Dans le doute, j'ai essayé de compiler mon code par la console linux avec g++.
    De cette manière, la version suivante de mon code (corrigée, enfin j'éspère) fonctionne:

    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
    #include <iostream>
    #include "V3.hpp"
     
    using namespace std;
     
    int main()
    {
        V3 u(2.1,5.3,6.4);
        cout << u << endl;
        V3 v;
        cout << u << endl;
        return 0;
    }
    V3.hpp
    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
    #ifndef V3_HPP
    #define V3_HPP
     
    #include <iostream>
     
    class V3
    {
        private:
            float x;
            float y;
            float z;
        public:
            V3();
            V3(float px, float py, float pz);
            V3(const V3& v);
            virtual ~V3();
            V3& operator=(const V3& v);
            V3& operator+(const V3& v);
            float getX() const;
            float getY() const;
            float getZ() const;
            void setX(float _x);
            void setY(float _y);
            void setZ(float _z);
            V3& operator+=(const V3& v);
            bool isNull();
    };
     
    bool operator==(const V3& u, const V3& v);
    float operator%(const V3& u, const V3& v);
    V3 operator^ (const V3& u, const V3& v);
    bool operator||(const V3& u, const V3& v);
    std::ostream& operator<<(std::ostream& os, const V3& v);
    #endif // V3_HPP_INCLUDED
    V3.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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include "V3.hpp"
     
    V3::V3()
    {
        this->x = 0;
        this->y = 0;
        this->z = 0;
    }
    V3::V3(float px, float py, float pz): x(px), y(py), z(pz)
    {}
    V3::V3(const V3& v)
    {
        this->x = v.x;
        this->y = v.y;
        this->z = v.z;
    }
    V3::~V3()
    {}
    V3& V3::operator=(const V3& v)
    {
        this->x = v.x;
        this->y = v.y;
        this->z = v.z;
        return *this;
    }
    V3& V3::operator+(const V3& v)
    {
        this->x += v.x;
        this->y += v.y;
        this->z += v.z;
        return *this;
    }
     
    V3& V3::operator+=(const V3& u)
    {
        (*this) = (*this)+u;
        return *this;
    }
     
    float V3::getX() const
    {
        return this->x;
    }
     
    float V3::getY() const
    {
        return this->y;
    }
     
    float V3::getZ() const
    {
        return this->z;
    }
     
    void V3::setX(float _x)
    {
        this->x = _x;
    }
     
    void V3::setY(float _y)
    {
        this->y = _y;
    }
     
    void V3::setZ(float _z)
    {
        this->z = _z;
    }
     
    bool V3::isNull()
    {
        return (this->x==0 && this->y==0 && this->z==0);
    }
     
    bool operator==(const V3& u, const V3& v)
    {
        return (u.getX() == v.getX() && u.getY() == v.getY()
                && u.getZ() == v.getZ());
    }
     
    float operator%(const V3& u, const V3& v)
    {
        return (u.getX()*v.getX() + u.getY()*v.getY() + u.getZ()*v.getZ());
    }
     
    V3 operator^(const V3& u, const V3& v)
    {
        V3 w;
        w.setX(u.getY()*v.getZ() - u.getZ()*v.getY());
        w.setY(u.getX()*v.getZ() - u.getZ()*v.getX());
        w.setZ(u.getX()*v.getY() - u.getX()*v.getY());
        return w;
    }
     
    bool operator||(const V3& u, const V3& v)
    {
        return (u^v).isNull();
    }
     
    std::ostream& operator<<(std::ostream& os, const V3& v)
    {
        os << "Vecteur:" << std::endl << "x: " << v.getX() << std::endl << "y: " << v.getY() << std::endl << "z: " << v.getZ() << std::endl;
        return os;
    }
    Comme je disais ce code compile à la main avec g++. Cependant lorsque j'essaie de le compiler sous Code::Blocks, je retrouve les erreurs donc je vous parle depuis le début de ce topic.

    Il doit vraisemblablement s'agir d'un mauvais paramétrage du compilateur utilisé par Code::Blocks, mais je n'ai pas touché à ce paramétrage et à priori c'est le compilateur GNU qui est utilisé.

    Auriez vous des idées en ce qui concerne ces erreurs sous Code::Blocks ?

    Je vous remercie pour toutes vos réponses, cela me fait avancer.

    Ben

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tu dois avoir avec Code::Block un fichier avec l'extension cbp. Peux tu le poster ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Il semblerait finalement que le compilateur utilisé soit gcc, à croire le .cbp.
    Je suppose qu'il faut spécifier que g++ est à utiliser à sa place ?
    Voici le .cbp:
    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
    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <CodeBlocks_project_file>
    	<FileVersion major="1" minor="6" />
    	<Project>
    		<Option title="SysPar" />
    		<Option pch_mode="2" />
    		<Option compiler="gcc" />
    		<Build>
    			<Target title="Debug">
    				<Option output="bin/Debug/SysPar" prefix_auto="1" extension_auto="1" />
    				<Option object_output="obj/Debug/" />
    				<Option type="1" />
    				<Option compiler="gcc" />
    				<Compiler>
    					<Add option="-g" />
    				</Compiler>
    			</Target>
    			<Target title="Release">
    				<Option output="bin/Release/SysPar" prefix_auto="1" extension_auto="1" />
    				<Option object_output="obj/Release/" />
    				<Option type="1" />
    				<Option compiler="gcc" />
    				<Compiler>
    					<Add option="-O2" />
    				</Compiler>
    				<Linker>
    					<Add option="-s" />
    				</Linker>
    			</Target>
    		</Build>
    		<Compiler>
    			<Add option="-Wall" />
    			<Add option="-fexceptions" />
    		</Compiler>
    		<Unit filename="V3.cpp">
    			<Option target="&lt;{~None~}&gt;" />
    		</Unit>
    		<Unit filename="V3.hpp">
    			<Option target="&lt;{~None~}&gt;" />
    		</Unit>
    		<Unit filename="main.cpp" />
    		<Extensions>
    			<code_completion />
    			<debugger />
    		</Extensions>
    	</Project>
    </CodeBlocks_project_file>
    J'ai essayé de changer de complateur mais g++ n'est pas présent dans la liste visible dans Settings>Compiler and debugger settings.
    Comment faire pour ajouter un compilateur à Code::Blocks ?

    Merci à tous pour vos réponses.
    Ben

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    A vue de nez, je dirais, ouvre le fichier .cbp avec un éditeur de texte et remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		<Unit filename="V3.cpp">
    			<Option target="&lt;{~None~}&gt;" />
    		</Unit>
    		<Unit filename="V3.hpp">
    			<Option target="&lt;{~None~}&gt;" />
    		</Unit>
    par simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		<Unit filename="V3.cpp"/>
    		<Unit filename="V3.hpp"/>
    J'ai l'impression que ton fichier est bien dans l'environnement mais pas associé à une cible, donc pas compilé d'où l'erreur de lien.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Bonsoir,

    Un grand merci 3DArchi, ça fonctionne. Est-ce que tu pourrais m'expliquer brièvement le pourquoi de la chose ?

    Ben

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Unit filename="V3.cpp">
            <Option target="&lt;{~None~}&gt;" />
    </Unit>
    Associe le fichier 'V3.cpp' à une cible de production 'None' ou pour le reformuler autrement, v3.cpp est bien dans ton projet mais pas compilé pour produire l'exécutable. D'où le problème de link puisque les fonctions ne sont jamais compilées et liées.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Un grand merci à toi. Problème résolu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/03/2008, 16h57
  2. [Nioub] Erreur undefined reference
    Par grabriel dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 17/03/2008, 12h45
  3. Erreur compilation "undefined reference to "
    Par ViRouF dans le forum C++
    Réponses: 5
    Dernier message: 02/03/2007, 14h55
  4. erreur undefined reference
    Par petith dans le forum C
    Réponses: 2
    Dernier message: 13/12/2006, 17h04

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