2012-08-10 4 views
9

einige dieser Fehler durch ÄnderungC++: Was sind die Ursachen für „undefined Verweis auf‚Typeinfo für [Klassenname]‘“ andere als virtuelle Funktionen

virtual void draw(); 

zu

virtual void draw() {}; 

gelöst werden Aber was können die anderen Ursachen dieser Fehler sein ?, andere als virtuelle Funktionen .. Was die Ursache für die folgenden Fehler sein kann ..

/tmp/cciGEgp5.o:(.rodata._ZTI14CustomXmppPump[typeinfo for CustomXmppPump]+0x18): 
    undefined reference to `typeinfo for XmppPump' 
+1

Vielleicht haben Sie nur die .h oder .hpp-Datei im Build, ohne die entsprechende .cpp-Datei –

+0

Sie verwirren Deklarationen und Definitionen. –

+3

Sieht so aus, als würden Sie ohne RTTI kompilieren. Beachten Sie, dass die undefinierte Referenz für die ** typeinfo ** nicht für die tatsächliche virtuelle Funktion gilt. Dies ist ein ["bekanntes Problem"] (http://code.google.com/p/libjingle/issues/detail?id=143), das Sie auch auf der libjingle-Website finden. – Damon

Antwort

5

In GCC wird die erste nichtlineare virtuelle Methode verwendet, um die Übersetzungseinheit zu bestimmen, in der die Objekte vtable und typeinfo erstellt werden. Wenn Sie diese Methode dann nicht definieren, wird der angezeigte Fehler erstellt, da erwartet wurde, dass Sie diese Methode definiert haben und auf diese Definition gewartet hat, um die Ausgabe von vtable und typeinfo für die Klasse auszugeben.

http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html

Wenn Sie die Erklärung von virtual void draw(); zur Inline-Definition virtual void draw() {}; ändern, nimmt er eine andere Funktion der V-Tabelle zu emittieren.

+0

Wenn alle Definitionen von virtuals sichtbar sind, dann könnte jede TU, die sie enthält, ihre eigene Kopie bekommen (bad). – justin

+0

@Justin: Richtig. Es verursacht zusätzliche Bloat in der Objektcode, der vom Linker eliminiert werden muss, was zeitaufwendig sein kann. –

9

Wenn Sie mit RTTI (-frtti) kompilieren, stellen Sie sicher, dass Ihre abhängigen Bibliotheken auch damit kompiliert werden, und nicht -fno-rtti. Andernfalls erhalten Sie den typeinfo-Fehler, wenn Sie eine mit -fno-rtti kompilierte Klasse ableiten oder dynamic_cast verwenden.

Verwandte Themen