g ++ referencia indefinida a typeinfo

g ++ referencia indefinida a typeinfo

Una posible razón es que está declarando una función virtual sin definirla.

Cuando lo declara sin definirlo en la misma unidad de compilación, está indicando que está definido en otro lugar; esto significa que la fase del enlazador intentará encontrarlo en una de las otras unidades de compilación (o bibliotecas).

Un ejemplo de definición de la función virtual es:

virtual void fn() { /* insert code here */ }

En este caso, está adjuntando una definición a la declaración, lo que significa que el enlazador no necesita resolverlo más tarde.

La linea

virtual void fn();

declara fn() sin definirlo y provocará el mensaje de error por el que preguntó.

Es muy similar al código:

extern int i;
int *pi = &i;

que establece que el número entero i se declara en otra unidad de compilación que debe resolverse en el momento del enlace (de lo contrario, pi no se puede establecer en su dirección).


Esto también puede suceder cuando mezclas -fno-rtti y -frtti código. Luego, debe asegurarse de que cualquier clase, que type_info se accede en el -frtti código, tener su método clave compilado con -frtti . Dicho acceso puede ocurrir cuando crea un objeto de la clase, use dynamic_cast etc.

[fuente]


Esto ocurre cuando a las funciones virtuales declaradas (no puras) les faltan cuerpos. En la definición de tu clase, algo como:

virtual void foo();

Debe definirse (en línea o en un archivo fuente vinculado):

virtual void foo() {}

O declarado puro virtual:

virtual void foo() = 0;