Abrufen von „Undefinierter Verweis auf vtable für {Klassenname}

Ich habe eine große Sammlung von Bibliotheken, die korrekt kompiliert werden, aber keine Verknüpfung herstellen. Ich verwende Visual Micro für Visual Studio 2015. Hier ist die vollständige Sammlung von Fehlermeldungen:

CommandPattern3.cpp.o:In function `DualMotorRomeo DualMotorRomeo.h:undefined reference to `vtable for DualMotorRomeo DualMotorRomeo.h:undefined reference to `vtable for DualMotorRomeo CommandPattern3.cpp.o:In function `__static_initialization_and_destruction_0 CommandPattern3.ino:undefined reference to `DualMotorRomeo ~DualMotorRomeo() collect2.exe*:error: ld returned 1 exit status Error compiling for board Arduino/Genuino Mega w/ ATmega2560 (Mega 2560) 

Ich habe den Code mit einem feinen Kamm durchlaufen. kann aber nicht sehen, welche Referenzen undefiniert sind.

Gibt es ein Windows 10-Dienstprogramm, das die vTables untersuchen und mir helfen kann, herauszufinden, was fehlt?

Die Codebasis ist zu groß zum Posten, aber ich kann jedem, der helfen möchte, eine ZIP-Datei mit dem gesamten Code zur Verfügung stellen.

Kommentare

  • Der Linker ist bemüht, Ihnen zu helfen. Überprüfen Sie DualMotorRomeo.h und ob es einen Destruktor gibt (muss möglicherweise abhängig von der Vererbung virtuell sein?).

Antwort

Ich habe keine Header-Datei für DualMotorRomeo, aber der Linker sagt, dass ein Destruktor deklariert wurde (~DualMotorRomeo() ) im Klassenheader, aber es wurde kein Destruktor definiert. Wenn Sie DualMotorRomeo nicht geschrieben haben, muss die Bibliothek aktualisiert werden.

Bis dahin einfach Fügen Sie einer Ihrer Quelldateien Folgendes hinzu:

DualMotorRomeo::~DualMotorRomeo() { } // DualMotorRomeo::~DualMotorRomeo() 

Dadurch werden auch die vtable -Linkerfehler behoben – die vtable wird in die kompilierte Datei aufgenommen, in der dies deklariert ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.