La compilation échoue : undefined reference — comment trouver et corriger l'erreur

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

« Undefined reference » — le principal ennemi du débutant en C++ (et pas que)

\n\n

Vous écrivez du code, tout semble parfait, le compilateur se tait, vous appuyez sur « Compiler » — et là… un mur de texte rouge. Le héros de ce cauchemar est undefined reference (ou unresolved external symbol). Ça vous dit quelque chose ? Si vous avez déjà écrit en C++, vous avez sûrement rencontré cette erreur. Elle effraie les débutants, mais en réalité, ce n'est qu'un signal : « Je sais de quelle fonction tu parles, mais je ne trouve pas son implémentation ».

\n\n

Dans ce tutoriel, nous allons voir ce qu'est l'erreur de référence non définie, pourquoi elle se produit et, surtout, comment la corriger. Vous découvrirez les 5 causes les plus fréquentes et obtiendrez une liste de contrôle prête à l'emploi pour résoudre le problème. C'est parti !

\n\n

Qu'est-ce que undefined reference / unresolved external symbol ?

\n\n

Commençons par la théorie, mais très brièvement. Le processus de compilation d'un programme C++ se déroule en deux étapes :

\n
    \n
  • Compilation — chaque fichier .cpp est transformé en fichier objet (.o ou .obj). Le compilateur vérifie la syntaxe et mémorise les fonctions déclarées (prototypes).
  • \n
  • Édition de liens (linkage) — l'éditeur de liens (linker) assemble tous les fichiers objets et les bibliothèques en un seul fichier exécutable. À cette étape, il recherche les implémentations de toutes les fonctions promises.
  • \n
\n\n

L'erreur undefined reference (dans Visual Studio — unresolved external symbol) se produit précisément lors de l'édition de liens. Le compilateur a réussi, mais l'éditeur de liens n'a pas trouvé le corps de la fonction. Il crie : « Tu as dit que la fonction foo() existe, mais je ne trouve pas où elle est définie ! ».

\n\n

Top 5 des causes de l'erreur undefined reference en C++

\n\n

Examinons les scénarios les plus courants avec des exemples concrets. Dans chaque cas, je montrerai le code erroné et la méthode de correction.

\n\n

1. Vous avez déclaré mais pas défini la fonction

\n

Un classique. Vous avez écrit le prototype d'une fonction, mais vous avez oublié l'implémentation.

\n
// main.cpp\n#include <iostream>\n\nvoid hello(); // déclaration (prototype)\n\nint main() {\n    hello();\n    return 0;\n}\n// L'implémentation de hello() est absente !\n
\n

Erreur de liaison : undefined reference to `hello()'. Correction : ajoutez le corps de la fonction.

\n\n

2. Vous n'avez pas inclus le fichier d'implémentation dans la compilation

\n

C'est un problème fréquent lorsque vous travaillez avec plusieurs fichiers .cpp. Supposons que vous ayez déclaré une fonction dans utils.h, défini dans utils.cpp, mais oublié d'ajouter utils.cpp à la commande de compilation.

\n
// utils.h\nvoid printMessage();\n\n// utils.cpp\n#include <iostream>\n#include "utils.h"\nvoid printMessage() {\n    std::cout << "Hello!" << std::endl;\n}\n\n// main.cpp\n#include "utils.h"\nint main() {\n    printMessage();\n    return 0;\n}\n
\n

Si vous compilez uniquement main.cpp (g++ main.cpp), l'éditeur de liens ne verra pas utils.cpp. Correction : compilez les deux fichiers ensemble : g++ main.cpp utils.cpp -o program.

\n\n

3. La classe ou le modèle est défini dans .cpp et non dans .h

\n

C'est une douleur spécifique au C++. Si vous définissez une méthode de classe directement dans un fichier .cpp, mais que vous n'incluez que l'en-tête, l'éditeur de liens ne trouvera pas l'implémentation.

\n
// MyClass.h\nclass MyClass {\npublic:\n    void doSomething();\n};\n\n// MyClass.cpp\n#include "MyClass.h"\nvoid MyClass::doSomething() { /* ... */ }\n\n// main.cpp\n#include "MyClass.h"\nint main() {\n    MyClass obj;\n    obj.doSomething(); // Erreur : undefined reference\n    return 0;\n}\n
\n

Correction : assurez-vous que MyClass.cpp participe à la compilation (voir point 2).

\n\n

4. Mauvaise liaison des bibliothèques (par exemple, math.h)

\n

Certaines bibliothèques (comme la bibliothèque mathématique libm) nécessitent une indication explicite

Blogs

Book Recommendations