2009-11-07 12 views
35

Fast der letzte Schritt, aber immer noch einige seltsame erros ....Nicht definierte Symbole "vtable for ..." und "typeinfo for ..."?

bash-3.2$ make 
g++ -Wall -c -g Myworld.cc 
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem 
Undefined symbols: 
    "vtable for Obstacle", referenced from: 
     Obstacle::Obstacle()in Myworld.o 
    "typeinfo for Obstacle", referenced from: 
     typeinfo for RECTANGLEin RECTANGLE.o 
     typeinfo for CIRCLEin CIRCLE.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [solvePlanningProblem] Error 1 

Was ist die Bedeutung von V-Tabelle ist und Typeinfo?

+0

Erinnern Sie sich zurück auf [Ihre ursprüngliche Frage] (http://stackoverflow.com/questions/1693471/undefined-symbols-ld-symbol-not-found) und schreiben einige Code oder beantworten einige der Fragen, die Menschen zu gehen fragte dich dort. Das wird dir wahrscheinlich schnellere Ergebnisse bringen. :) – Troubadour

+0

Ich möchte wirklich aber die Seite nur fehlt, danke, werde ich wieder – Lisa

+0

finden Sie die Antwort finden Sie hier! http://stackoverflow.com/questions/1458180/vtable-for-referenced-from-compile-error-xcode –

Antwort

1

vtable und Typeinfo sind interne Strukturen durch die Compiler C++ erzeugt. Vtable wird zum Aufrufen von Funktionen verwendet und typistinfo wird für RTTI verwendet.

Verschiedene Compiler haben unterschiedliche Strategien, wenn sie diese Strukturen generieren. Eine Strategie, die ich gesehen habe, ist, dass sie die Tabelle in derselben Objektdatei generieren, die die erste virtuelle Funktion in der Klasse enthält.

+0

Was den oben genannten Fehler betrifft, was bedeuten undefinierte Symbole? – Lisa

2

Haben Sie eine Obstacle.cc Datei? Wenn dies der Fall ist, müssen Sie sicherstellen, dass es in Obstacle.o integriert wird und dass Obstacle.o zur Befehlszeile hinzugefügt wird, wenn Sie Ihr Programm verknüpfen.

Stellen Sie außerdem sicher, dass Sie alle die nicht rein virtuellen Methoden definieren Sie deklarieren. Wenn Sie einen reinen virtuellen Destruktor deklarieren, müssen Sie dies ebenfalls definieren.

+0

Muss ich ein Obstacle.cc haben, da es nur einige virtuelle Funktionen hat? – Lisa

+0

@Lisa: nicht unbedingt, aber das Definieren nichtlinearer Nicht-Template-Methoden/-Funktionen in einer .h-Datei führt wahrscheinlich zu einem anderen Linkerfehler (mehrere Definitionen). Ich nehme an, dass alles in Hindernis inline ist. Haben Sie Definitionen für alle Elementfunktionen von Obstacle geschrieben, einschließlich Konstruktor (en) und Destruktor? Beachten Sie, dass, wenn Obstacle einen reinen virtuellen Destruktor hat, Sie immer noch eine Definition dafür schreiben müssen. – bk1e

+0

Hat Obstacle nur rein virtuelle Funktionen? Strike das - es spielt keine Rolle, wenn es um Vtables geht. Sie benötigen ein Obstacle.o, damit der Compiler irgendwo die virtuelle Tabelle von Obstacle speichern und Informationen eingeben kann. – outis

70

Wenn Hindernis eine abstrakte Basisklasse ist, dann stellen Sie sicher, dass all seine virtuellen Methoden „rein virtuelle“ erklären:

virtual void Method() = 0; 

Die = 0 teilt den Compiler mit, dass diese Methode von einer abgeleiteten Klasse überschrieben werden müssen, und hat möglicherweise keine eigene Implementierung.

Wenn die Klasse irgendwelche nicht-reinen virtuellen Funktionen enthält, dann nimmt der Compiler an, dass sie irgendwo eine Implementierung haben, und ihre internen Strukturen (vtable und typeinfo) könnten in derselben Objektdatei erzeugt werden wie eine davon; Wenn diese Funktionen nicht implementiert sind, fehlen die internen Strukturen und Sie erhalten diese Fehler.

+0

Ich bin gerade auf dieses Problem in meinem eigenen Code gestoßen. Ich habe diese Seite über die Google-Suche gefunden und die Änderung, die Sie angegeben haben, vorgenommen und sie behoben. Vielen Dank! : D – Aishwar

+0

Gleich wie oben - gefunden auf Google - Problem sofort gelöst, Lösung war schnell und einfach! Ich hatte ein anderes reines virtuelles Mitglied zu einer Liste der virtuellen Funktionen hinzugefügt und vergessen, das Token = 0 hinzuzufügen! oops – Marm0t

+0

Große Antwort - löste mein Problem auch! – TCSGrad

5

Die Klasse Obstacle benötigt einen virtuellen Destruktor. Ändern Sie die destructor Definition sein:

virtual ~Obstacle(); 

Die Definition eines destructor schafft auch die VTable für eine Klasse mit virtuellen Funktionen. Es stellt auch sicher, dass das Löschen einer abgeleiteten Klasseninstanz über einen Basisklassenzeiger das Richtige tut.

(Kopie meiner Antwort What should I do with this strange error? in Frage zu stellen, die ein Duplikat zu sein scheint.)

+2

In meinem Fall musste ich nicht nur den Destruktor definieren, sondern auch vergessen, die Implementierung in meiner cpp-Datei zu definieren. – Ricket

1

Es gibt einen weiteren Grund, warum Sie diese Fehlermeldung erhalten können, und wollen einfach nur hier zu dokumentieren. Ich verlinkte mit einer statischen Bibliothek, die keine RTTI hatte. So mit der C++ - Flag -fno-rtti für mich behoben. Wenn Sie RTTI nicht benötigen, können Sie auch dieses Flag verwenden. Hoffe das hilft.