C++ undefined reference to

Résolu/Fermé
MrEdmund Messages postés 1 Date d'inscription jeudi 4 août 2022 Statut Membre Dernière intervention 4 août 2022 - Modifié le 5 août 2022 à 14:44
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 5 août 2022 à 15:07

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
A voir également:

1 réponse

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
Modifié le 5 août 2022 à 15:08

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