Erreur "undefined reference"
Fermé
Aquarigio_116
Messages postés
1
Date d'inscription
lundi 17 juin 2019
Statut
Membre
Dernière intervention
17 juin 2019
-
Modifié le 17 juil. 2019 à 14:06
mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 - 17 juil. 2019 à 14:28
mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 - 17 juil. 2019 à 14:28
A voir également:
- C++ undefined reference to
- Reference pto - Accueil - Box & Connexion Internet
- Excel la référence n'est pas valide - Forum Excel
- Erreur automation référence future non valide ✓ - Forum Word
- Reference assemblies ✓ - Forum Windows 7
- Dans le document à télécharger, les références des pièces détachées sont affichées par pays, puis par type de pièces. réorganisez le document pour avoir : les pays dans l'ordre alphabétique : allemagne, espagne, france et italie ; et pour chaque pays, les pièces d'auto, de bateau et de moto dans cet ordre. quelle est la référence de la pièce en ligne 500 ? ✓ - Forum Windows
1 réponse
mamiemando
Messages postés
33433
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 décembre 2024
7 809
Modifié le 17 juil. 2019 à 14:29
Modifié le 17 juil. 2019 à 14:29
Bonjour,
Plusieurs recommandations : Indente ton code, et rends le minimal (cf ta discussion sur color) avant de poser ta question.
Pré-requis
Tout d'abord quelques rappels sur la compilation en C++ quand plusieurs fichiers sont mis en jeu.
1) Le pré-compilateur résout toutes les opérations précédées de
2) Le compilateur (e.g.
3) Le linker s'occupe de rassembler les "morceaux" pour former le binaire final. Ce binaire final peut être la l'exécutable (
Retour à ton problème
Dans ton cas, tu as un problème lié au linkage. Voici un exemple complet, fonctionnel, et minimal :
bdd.hpp :
bdd.cpp :
main.cpp :
Compilation :
(Ici sous linux) :
Les deux premières commandes produisent respectivement
Exécution :
Bonne chance
Plusieurs recommandations : Indente ton code, et rends le minimal (cf ta discussion sur color) avant de poser ta question.
Pré-requis
Tout d'abord quelques rappels sur la compilation en C++ quand plusieurs fichiers sont mis en jeu.
1) Le pré-compilateur résout toutes les opérations précédées de
#(précompilation), ce qui inclue notamment
#includeet
#define. Il n'y a pas d'intelligence à ce stade ce ne sont que des manipulation texte (copier-coller, substitution, etc). Si un
#includen'est pas résolu, c'est soit que le chemin est faux, soit qu'il faut passer des options au compilateur pour lui dire où chercher. Ce n'est pas ton erreur ici.
2) Le compilateur (e.g.
g++) compile individuellement chaque fichier source (fichiers
.cpp). À ce stade les fonctions déclarées mais non implémentées (comme celles récupérées par inclusion d'un header) ne lève pas d'erreur. C'est le travail du linker (voir étape 3). Donc à ce stade, le compilateur s'occupe de générer le code machine correspondant aux fonctions implémentées dans le
.cppet suppose que le reste sera retrouvé par la suite. Chaque fichier
.cppengendre un fichier
.o. Si une méthode / fonction n'est pas trouvée parmi les fonctions déclarée tu auras une erreur.
3) Le linker s'occupe de rassembler les "morceaux" pour former le binaire final. Ce binaire final peut être la l'exécutable (
.exesous windows) ou la librairie (
.dllou
.libsous windows ;
.soou
.asous linux) que tu es en train de compiler. En outre le linker vérifie que chaque fonction utilisée est implémentée exactement une seule fois à partir des "morceaux" qu'on réunit. Et donc naturellement les erreurs typiques à cette étape sont des définitions multiples (plus d'une occurrence) ou non résolues (aucune occurrence trouvée). Les "morceaux" réunis sont typiquement des
.oou des librairies.
Retour à ton problème
Dans ton cas, tu as un problème lié au linkage. Voici un exemple complet, fonctionnel, et minimal :
bdd.hpp :
#ifndef BDD_HPP #define BDD_HPP class Bdd { public: Bdd(); ~Bdd(); }; #endif
bdd.cpp :
#include <iostream> #include "bdd.hpp" using namespace std; Bdd::Bdd() { cout << "construction" << endl; } Bdd::~Bdd() { cout << "destruction" << endl; }
main.cpp :
#include "bdd.hpp" int main() { Bdd * bdd = new Bdd(); delete bdd; return 0; }
Compilation :
(Ici sous linux) :
g++ -c bdd.cpp g++ -c main.cpp g++ main.o bdd.o -o programme
Les deux premières commandes produisent respectivement
bdd.oet
main.o. La troisième commande réunit
main.o,
bdd.opour produire l'exécutable
programme(qu'on appelerait
programme.exesous windows). On aurait typiquement écrit quelque chose du genre
g++ main.o bdd.o -lmysql -o programmepour linker avec
/usr/lib/libmysql.so.
Exécution :
(mando@silk) (~) $ ./programme
construction
destruction
Bonne chance