2012-08-10 12 views
9

algunos de estos errores se resuelven mediante la modificaciónC++: ¿cuáles son las causas de la "referencia indefinida a 'typeinfo de [nombre de la clase]'" aparte de las funciones virtuales

virtual void draw(); 

a

virtual void draw() {}; 

PERO, ¿cuáles pueden ser las otras causas de estos errores ?, además de las funciones virtuales ... ¿Cuál puede ser la causa del siguiente error ...

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

Quizás tenga solo el archivo .h o .hpp en la compilación, sin el archivo .cpp correspondiente –

+0

Está confundiendo las declaraciones y las definiciones. –

+3

Parece que está compilando sin RTTI. Tenga en cuenta que la referencia indefinida es para ** typeinfo **, no para la función virtual real. Este es un ["problema conocido"] (http://code.google.com/p/libjingle/issues/detail?id=143) que también encontrará en el sitio libjingle. – Damon

Respuesta

5

En GCC, el primer método virtual no en línea se utiliza para determinar la unidad de traducción donde se crean los objetos vtable y typeinfo. Si no define ese método, crea el error que ve, ya que esperaba que definiera ese método en algún lugar, y estaba esperando que esa definición emitiera la salida de la tabla de información y escriba para la clase.

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

Cuando cambia la declaración de virtual void draw(); a la definición de la línea virtual void draw() {};, que recoge una función diferente para emitir la viable.

+0

a menos que todas las definiciones de virtuales estén visibles. En ese caso, cada TU que lo incluya podría obtener su propia copia (incorrecta). – justin

+0

@Justin: Correcto. Causa hinchazón adicional en el código de objeto, que debe ser eliminado por el enlazador, que puede ser consensual en el tiempo. –

9

Si está compilando con RTTI (-frtti), asegúrese de que sus bibliotecas dependientes también estén compiladas con él, y no -fno-rtti. De lo contrario, obtendrás el error typeinfo cuando subclases una clase compilada con -fno-rtti o uses dynamic_cast.

Cuestiones relacionadas