Undefinierte Referenz auf Class::Function() in C++
- Arten von Fehlern in C++
-
Undefinierter Verweis auf eine
Class::Function()
in C++ -
Undefinierte Referenz auf eine
Class::Function()
aufgrund fehlender Funktionsdefinition in C++ auflösen -
Undefinierte Referenz auf eine
Class::Function()
aufgrund nicht verknüpfter Objektdateien in C++ auflösen -
Undefinierte Referenz auf eine
Class::Function()
aufgrund nicht kompilierter abhängiger Dateien in C++ auflösen
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.
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.
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