C++ undefined reference to
RésoluBonjour à 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
- Undefined reference to cpp
- Qwerty to azerty - Guide
- Reference pto - Accueil - Box & Connexion Internet
- Video to video - Télécharger - Conversion & Codecs
- Majuscule to minuscule - Guide
- Bat to exe converter - Télécharger - Édition & Programmation
1 réponse
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