2009-11-07 17 views
35

Casi el paso final, pero todavía algunos erros extrañas ....Símbolos indefinidos "vtable for ..." and "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 

¿Cuál es el significado de vtable y TypeInfo?

+0

Recuerde volver a [su pregunta original] (http://stackoverflow.com/questions/1693471/undefined-symbols-ld-symbol-not-found) y publique algún código o responda algunas de las preguntas que la gente tiene te pregunté allí. Eso probablemente te dará resultados más rápidos. :) – Troubadour

+0

realmente quiero pero el sitio que falta, gracias, volveré – Lisa

+0

por favor encuentre la respuesta aquí! http://stackoverflow.com/questions/1458180/vtable-for-referenced-from-compile-error-xcode –

Respuesta

1

vtable y typeinfo son estructuras internas generadas por el compilador de C++. vtable se usa para invocar funciones virtuosas y typeinfo se usa para RTTI.

Diferentes compiladores tienen diferentes estrategias para cuando generan estas estructuras. Una estrategia que he visto es que generarán la tabla en el mismo archivo objeto que contiene la primera función virtual de la clase.

+0

en lo que se refiere al error anterior, ¿qué significan los símbolos indefinidos? – Lisa

2

¿Tiene un archivo Obstacle.cc? Si es así, debe asegurarse de que esté integrado en Obstacle.o, y que Obstacle.o se agregue a la línea de comando cuando vincula su programa.

Además, asegúrese de definir todos los métodos no puros virtuales que declare. Si declara un destructor virtual puro, debe definirlo también.

+0

debo tener un Obstacle.cc, ya que solo tiene algunas funciones virtuales? – Lisa

+0

@Lisa: no necesariamente, pero la definición de métodos/funciones no en línea que no sean plantillas en un archivo .h probablemente genere un error de enlazador diferente (múltiples definiciones). Así que supondré que todo en Obstáculo está en línea. ¿Escribiste definiciones para todas las funciones miembro de Obstacle, incluyendo el constructor (es) y el destructor? Tenga en cuenta que si Obstacle tiene un destructor virtual puro, aún así debe escribir una definición para él. – bk1e

+0

¿Obstácle tiene solo funciones virtuales puras? Golpee eso, no importa cuando se trata de vtables. Necesitas un Obstáculo.o entonces el compilador tiene un lugar para almacenar la tabla virtual de Obstáculo y escribir información. – outis

70

Si obstáculo es una clase base abstracta, entonces asegúrese de que cuenten todas sus métodos virtuales "virtual pura":

virtual void Method() = 0; 

El = 0 le dice al compilador que este método debe ser anulado por una clase derivada, y podría no tener su propia implementación.

Si la clase contiene funciones virtuales no puras, el compilador asumirá que tienen una implementación en alguna parte, y sus estructuras internas (vtable y typeinfo) se pueden generar en el mismo archivo de objeto como uno de esos; si esas funciones no se implementan, entonces faltarán las estructuras internas y obtendrá estos errores.

+0

Acabo de encontrar este problema en mi propio código. Encontré esta página a través de la búsqueda de Google e hice el cambio que dijiste y lo arregló. ¡Gracias! : D – Aishwar

+0

Igual que el anterior - encontrado en Google - problema resuelto de inmediato, ¡la solución fue rápida y fácil! ¡Había agregado otro miembro virtual puro a una lista de funciones virtuales y olvidé agregar el símbolo = 0! ¡Vaya! – Marm0t

+0

¡Gran respuesta, también resolvió mi problema! – TCSGrad

5

La clase Obstacle necesita un destructor virtual. Cambiar la definición destructor ser:

virtual ~Obstacle(); 

La definición de un destructor también crea la viable para una clase con funciones virtuales. También asegura que una eliminación de una instancia de clase derivada a través de un puntero de clase base hace lo correcto.

(copia de mi respuesta a la pregunta What should I do with this strange error? que parece ser un duplicado.)

+2

En mi caso, no solo necesité definir el destructor sino que también olvidé definir la implementación en mi archivo cpp. – Ricket

1

Hay otra razón por la que puede obtener este error, y sólo quiere documentar aquí. Estaba vinculando con una biblioteca estática que no tenía RTTI. Entonces usando la bandera C++ -fno-rtti arreglado para mí. Si no necesita RTTI, puede usar esta bandera también. Espero que esto ayude.

Cuestiones relacionadas