C++ undefined reference to

Résolu
MrEdmund Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour à tous,

Depuis un moment j'ai commencé le cours de c++ sur openclassrooms, et j'ai un problème pendant la compilation de mon code. J'ai l'erreur :

undefined reference to `Personnage::Personnage()'

Je tourne en rond depuis tous ce temps en tout cas c'était totalement vain... Je ne comprends pas du tout le problème et je ne trouve pas de solution sur le net, merci de bien vouloir m'éclairer sur ce sujet.

Voici mon code:

Arme.cpp

#include "Arme.hpp"

using namespace std;

Arme::Arme():
    m_nom("Epee rouillee"),
    m_degats(10)
{}

Arme::Arme(string nom, int degats):
    m_nom(nom),
    m_degats(degats)
{}

void Arme::changer(string nom, int degats) {
    m_nom = nom;
    m_degats = degats;
}

void Arme::afficher() const {
    cout << "Arme : " << m_nom << " (Degats : " << m_degats << ")" << endl;
}

main.cpp   

#include <iostream>
#include "Personnage.hpp"

using namespace std;

int main() {
    Personnage david;
    david.afficherEtat();
    return 0;
}

Personnage.cpp

#include "Personnage.hpp"
#include <string>

using namespace std;

Personnage::Personnage():
    m_vie(100),
    m_mana(100),
    m_arme("Epee rouillee", 10)
{}

Personnage::Personnage(string nomArme, int degatsArme):
    m_vie(100),
    m_mana(100),
    m_arme(nomArme, degatsArme)
{}

void Personnage::afficherEtat() const {
    cout << "vie: " << m_vie << endl;
    cout << "mana: " << m_mana << endl;
    m_arme.afficher();
}

Arme.hpp

#ifndef ARME_HPP_INCLUDED
#define ARME_HPP_INCLUDED

#include <iostream>
#include <string>

class Arme {
public:
    Arme();
    Arme(std::string nom, int degats);
    void changer(std::string nom, int degats);
    void afficher() const;
private:
    std::string m_nom;
    int m_degats;
};

#endif // ARME_HPP_INCLUDED

Personnage.hpp

#ifndef PERSONNAGE_HPP_INCLUDED
#define PERSONNAGE_HPP_INCLUDED

#include <iostream>
#include <string>
#include "Arme.hpp"

class Personnage{
public:
    Personnage();
    Personnage(std::string nomArme, int degatsArme);
    void afficherEtat() const;
private:
    int m_vie;
    int m_mana;
    Arme m_arme;
};

#endif // PERSONNAGE_HPP_INCLUDED

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     

    Bonjour,

    Merci quand tu soumets du code de le mettre en forme (voir ce lien).

    Le code est correct, donc je pense que c'est la manière dont tu compiles ton projet qui pose problème. Quel environnement de développement utilises-tu ? Utilises-tu un Makefile (ou mieux, cmake) ?

    Ce que je te propose, c'est d'installer et utiliser cmake (qui permet de générer un makefile à partir d'un fichier CMakeLists.txt), make (qui permet de lire un fichier Makefile en vue de compiler un projet) et g++ (pour compiler).

    Installation

    Si tu es sous Debian ou une distribution Linux qui en dérive, installe-les comme suit :

    sudo apt update
    sudo apt install cmake make g++

    Si tu es sous MacOS ou une autre distribution Linux, installe ces paquets via ton gestionnaire de paquets habituel.

    Si tu es sous windows, je te laisse le soin de regarder un tutoriel sur l'utilisation de cmake sous Windows.

    Utilisation

    Organise ton projet comme suit :

    ./CMakeLists.txt
    ./src
    ./src/Arme.hpp
    ./src/Personnage.cpp
    ./src/Personnage.hpp
    ./src/Arme.cpp
    ./src/main.cpp

    où le fichier CMakeLists.txt contient (voir ce lien pour plus de détails) :

    cmake_minimum_required(VERSION 3.12)
    
    # Set the project name
    project(jeu)
    
    # Find sources
    file(GLOB sources CONFIGURE_DEPENDS "src/*.hpp" "src/*.cpp")
    message(STATUS ${sources})
    
    # Add target to build the executable
    add_executable(jeu ${sources})

    Ensuite, place-toi qui contient CMakeLists.txt et lance :

    cmake .

    Exemple : chez moi l'ensemble du projet est stocké dans le dossier /home/mando/toto

    (mando@aldur) (~/toto) $ cmake .
    -- The C compiler identification is GNU 11.3.0
    -- The CXX compiler identification is GNU 11.3.0
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working C compiler: /usr/bin/cc - skipped
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/c++ - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- /home/mando/toto/src/Arme.cpp/home/mando/toto/src/Arme.hpp/home/mando/toto/src/Personnage.cpp/home/mando/toto/src/Personnage.hpp/home/mando/toto/src/main.cpp
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/mando/toto
    

    Cela crée dans le dossier courant un fichier Makefile (et quelques autres fichiers internes à cmake). Maintenant qu'on a ce fichier, on peut lancer la commande suivante :

    make

    Exemple :

    (mando@aldur) (~/toto) $ make
    [ 25%] Building CXX object CMakeFiles/jeu.dir/src/Arme.cpp.o
    [ 50%] Building CXX object CMakeFiles/jeu.dir/src/Personnage.cpp.o
    [ 75%] Building CXX object CMakeFiles/jeu.dir/src/main.cpp.o
    [100%] Linking CXX executable jeu
    [100%] Built target jeu

    Tu devrais alors voir apparaître dans le dossier courant un exécutable jeu, que tu peux lancer :

    (mando@aldur) (~/toto) $ ./jeu
    vie: 100
    mana: 100
    Arme : Epee rouillee (Degats : 10)

    Bonne chance

    1