undefined reference to XXYY



  • Ein häufiges Problem ist ein Linkerfehler mit dem Wortlaut "undefined reference", "unaufgelöster externer Verweis" oder ähnliches.
    Dieser Fehler taucht dann auf, wenn Funktionen oder Variablen deklariert, aber nicht definiert worden sind. Auf Folgendes ist zu achten:

    • Die Übersetzungseinheit (meist eine .cpp oder eine Bibliothek), die die fehlende Variablen- oder Funktionsdefinition enthält, muss dem Linker mit übergeben werden, bei IDEs heißt das, dass sie mit im Projekt eingebunden werden muss.
    • Bei statischen Klassenvariablen muss in der Übersetzungseinheit eine Definition existieren. Für integrale Konstanten kann dies gleich in der Klassendefinition geschehen, alle anderen Typen und nichtkonstante integrale Member müssen außerhalb der Klasendefinition definiert werden:
    //foo.h
    struct foo
    {
      static const int i = 5; //Deklaration + Definition einer integralen statischen Konstanten
      static std::string s; //Deklaration
    };
    
    //foo.cpp
    std::string foo::s = "statisch!"; //Definition in der .cpp
    

    Die Definition muss in der .cpp geschehen, da sonst in jeder ÜE eine Definition vorhanden wäre.

    • Bei Templates müssen alle Definitionen in der Headerdatei erfolgen. Templates haben keine eigene Übersetzungseinheit, d.h. keine .cpp. Das liegt daran, dass zum Zeitpunkt der Instantiierung die kompletten Definitionen für den Compiler sichtbar sein müssen. Hier braucht man im Gegensatz zu nicht-Templates keine Angst vor Mehrfachdefinitionen in verschiedenen Headern zu haben, der Linker erkennt Templateklassen und -funktionen und ignoriert die zusätzlichen Definitionen.
    • Die Definition einer Funktion muss die selbe Signatur haben wie ihre Deklarationen. Jedes const zählt!

Anmelden zum Antworten