Undefinierte Referenz auf Class::Function() in C++

Muhammad Husnain 12 Oktober 2023
  1. Arten von Fehlern in C++
  2. Undefinierter Verweis auf eine Class::Function() in C++
  3. Undefinierte Referenz auf eine Class::Function() aufgrund fehlender Funktionsdefinition in C++ auflösen
  4. Undefinierte Referenz auf eine Class::Function() aufgrund nicht verknüpfter Objektdateien in C++ auflösen
  5. Undefinierte Referenz auf eine Class::Function() aufgrund nicht kompilierter abhängiger Dateien in C++ auflösen
Undefinierte Referenz auf Class::Function() in C++

Dieses Tutorial behandelt kurz einen der häufigsten und ebenso kritischen Fehler in der C++-Programmierung (d. h. Undefined Reference to a Class::Function()).

Zunächst werden wir kurz auf verschiedene Fehler beim Codieren in C++ eingehen. Anschließend erläutern wir die Ursachen und Behebungen des Fehlers undefinierte Referenz.

Arten von Fehlern in C++

Die C++-Codes können wie jede andere Programmiersprache aus mehreren Gründen Fehlern oder Bugs unterliegen. Diese Fehler werden grob in die folgenden Fehlerkategorien eingeteilt:

  • Syntaxfehler sind die Fehler, die aufgrund von Verstößen gegen die Regeln von C++ oder irgendwelche Syntaxen auftreten.
  • Laufzeitfehler sind die Fehler, die auftreten, wenn kein syntaktisches Programmierproblem vorliegt, aber zum Zeitpunkt der Ausführung erkannt werden und zu einem Programmabsturz führen.
  • Logische Fehler treten auf, wenn wir nicht die gewünschten Ergebnisse oder Ausgaben erhalten, was bedeutet, dass es Fehler in der Logik unseres Programms gibt.
  • Linker-Fehler sind die Art von Fehlern, wenn das Programm erfolgreich kompiliert wird und versucht, einige andere Objekte mit unserer Hauptobjektdatei zu verknüpfen, und daher keine ausführbare Datei generiert wird. Zum Beispiel jeder falsche Prototyp der definierten Funktion, jede falsche enthaltene Header-Datei usw.

Undefinierter Verweis auf eine Class::Function() in C++

Dies ist der am häufigsten auftretende Fehler in C++ und gleichermaßen kritisch, insbesondere für neue Programmierer. Diese Art von Linker-Fehler kann die Ausführung des Programms beeinträchtigen.

Diese Fehler treten hauptsächlich auf, wenn das Programm erfolgreich kompiliert wurde und in der Verknüpfungsphase versucht, andere Objektdateien mit dem Hauptobjekt zu verknüpfen. Es gibt einige Fälle, in denen das Programm eine Ausgabe ausgibt und dieser Fehler auftritt.

Daher ist es manchmal kompliziert, solche Fehler aufzuspüren und zu korrigieren.

Der Fehler Undefinierte Referenz tritt auf, wenn wir eine Referenz auf eine Klasse, Funktion oder Variable verwendet haben. Der Linker kann seine Definition nicht in allen verknüpften Objektdateien und Bibliotheken finden und generiert daher den Fehler Undefined Reference to a Class::Function().

Es kann mehrere Ursachen für diese Fehler geben, aber wir werden einige davon hier besprechen.

Undefinierte Referenz auf eine Class::Function() aufgrund fehlender Funktionsdefinition in C++ auflösen

Dies kann der einfachste Grund für diesen Fehler sein, dass Sie den Prototyp der Funktion bereitgestellt, aber vergessen haben, ihre Definition anzugeben.

Wenn Sie eine Referenz für diese Funktion erstellen, findet der Linker ihre Definition nicht und generiert einen Fehler Undefined Reference to a Class::Function().

Dies wird im folgenden Beispiel demonstriert:

#include <iostream>
class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box

  double getArea(void);
};
int main() {
  Square sq1;
  sq1.getArea();
  return 0;
}

Ausgabe:

(.text+0x15): undefined reference to Square::getArea()
collect2.exe: error: ld returned 1 exit status

Undefinierte Referenz auf eine Class::Function() aufgrund nicht verknüpfter Objektdateien in C++ auflösen

Wenn Sie eine andere Datei zum Definieren einer Klasse verwenden, müssen wir diese Datei in die Hauptfunktionsdatei aufnehmen, um sie beim Verknüpfen des Programms mit der Hauptobjektdatei zu verknüpfen.

Im Beispiel unten haben wir die Klasse Square separat in einer anderen Datei definiert. In der Hauptdatei verweisen wir auf ihr Objekt, sodass ein undefinierter Referenzfehler ausgegeben wird, da die Datei nicht verknüpft ist.

Beispiel:

#include <iostream>
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

Beispiel (Square.cpp):

class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box
  double getArea(void) { return length * width; }
  void setLength(double l) { length = l; }
};

Die Lösung für dieses Problem besteht darin, die Datei Square.cpp im folgenden Code mit der Hauptdatei zu verknüpfen.

#include <iostream>

#include "square.cpp"
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

Undefinierte Referenz auf eine Class::Function() aufgrund nicht kompilierter abhängiger Dateien in C++ auflösen

Dieser Fehlertyp tritt auch auf, wenn nicht alle Abhängigkeiten des Programms erfolgreich kompiliert werden. Damit ein Linker erfolgreich eine ausführbare Datei generiert, müssen alle Abhängigkeiten kompiliert werden, bevor die Linking-Phase eingeleitet wird.

Dies ist unvermeidlich, damit der Linker alle abhängigen Objektdateien (d. h. .o-Dateien) leicht finden kann. Wenn abhängige Objektdateien fehlen, generiert der Linker einen undefined reference-Fehler.

Notiz
Wenn Sie den Compiler g++ von GNU verwenden, erzeugt der Bash-Befehl g++ -c abc.cpp eine entsprechende Objektdatei abc.o, ohne den Linker aufzurufen.

Abgesehen von den oben diskutierten Situationen kann es viele andere Situationen für den undefinierten Referenzfehler geben. Der Programmierer muss alle Bezeichner (z. B. Funktionen, Variablen und Objekte) korrekt definieren, um solche Probleme zu vermeiden.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Verwandter Artikel - C++ Error