Heim > Backend-Entwicklung > C++ > Warum erhalte ich Linker-Fehler „Undefinierter Verweis auf virtuelle Tabellen und Konstruktoren' in GCC C?

Warum erhalte ich Linker-Fehler „Undefinierter Verweis auf virtuelle Tabellen und Konstruktoren' in GCC C?

Linda Hamilton
Freigeben: 2024-12-18 08:49:10
Original
435 Leute haben es durchsucht

Why Am I Getting

GCC-C-Linker-Fehler: Undefinierter Verweis auf virtuelle Tabellen und Konstruktoren

In C ermöglichen virtuelle Funktionen abgeleiteten Klassen, in ihnen definierte Methoden zu überschreiben Basisklassen. Beim Linken eines Programms, das virtuelle Funktionen verwendet, erfordert der Linker, dass die Definitionen dieser Methoden in den Objektdateien vorhanden sind. Wenn diese Definitionen nicht bereitgestellt werden, kommt es zu undefinierten Referenzfehlern, wie zum Beispiel:

  • Undefinierter Verweis auf „vtable for XXX“
  • Undefinierter Verweis auf „ClassName::ClassName()“

Mögliche Ursachen

Diese Fehler können auftreten für Verschiedene Gründe, darunter:

  1. Überschriebene virtuelle Funktionen ohne Definitionen: Wie bereits erwähnt, muss jede virtuelle Funktion eine Definition in der endgültigen Klasse haben, die sie verwendet. Wenn Sie eine virtuelle Funktion in einer untergeordneten Klasse deklarieren, sie aber nicht definieren, meldet der Linker einen undefinierten Referenzfehler.
  2. Fehlende Header-Dateien: Die Header-Dateien, die die Klasse enthalten Definitionen sind möglicherweise nicht ordnungsgemäß in den Quelldateien enthalten, die sie verwenden.
  3. Falsche Bibliotheksverknüpfung: Stellen Sie sicher, dass Sie verlinken zur richtigen Bibliothek, die die Implementierungen der von Ihnen verwendeten Klassen enthält.

Bestätigung statischer Bibliotheken und Klassenverfügbarkeit

  1. Bibliotheksbitness: Um zu überprüfen, ob statische Bibliotheken 64-Bit sind, verwenden Sie die Datei Befehl:

    file -L <library_path>
    Nach dem Login kopieren

    Es sollte ein 64-Bit-x86-64-Shared-Objekt anzeigen, wenn die Bibliothek 64-Bit ist.

  2. Klassenverfügbarkeit: Verwenden Sie den Befehl objdump -t, um zu überprüfen, ob eine Bibliothek eine bestimmte Klasse enthält:

    objdump -t <library_path> | grep <class_name>
    Nach dem Login kopieren

    Wenn die Klasse vorhanden ist, wird sie in der Ausgabe aufgeführt.

Beispielproblem

Wie im bereitgestellten Fehlerprotokoll gezeigt, der undefinierte Verweis auf SomeClass::close() gibt an, dass die Klasse verwendet, aber nicht definiert wurde. Ebenso legen die undefinierten Verweise auf SomeClass::SomeClass() und vtable für SomeOtherClass nahe, dass der Konstruktor und die virtuelle Tabelle für die SomeOtherClass-Klasse nicht in den Objektdateien definiert sind.

Lösung

Um dieses Problem zu beheben, stellen Sie sicher, dass alle virtuellen Funktionen in den entsprechenden untergeordneten Klassen definiert sind, die erforderlichen Header-Dateien enthalten sind und die richtigen Bibliotheken mit Ihren verknüpft sind Programm.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich Linker-Fehler „Undefinierter Verweis auf virtuelle Tabellen und Konstruktoren' in GCC C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage