for c++ linker-errors undefined-reference vtable pure-virtual

c++ - for - undefined reference to vtable qt



Símbolos indefinidos "vtable for..." y "typeinfo for..."? (5)

Casi el último paso, pero aún algunos erros extraños ....

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?


¿Tienes un archivo Obstacle.cc ? Si es así, debes asegurarte de que esté integrado en Obstacle.o , y que Obstacle.o se agregue a la línea de comando cuando vincules tu 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.


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


La clase Obstáculo necesita un destructor virtual. Cambie la definición de destructor por ser:

virtual ~Obstacle();

La definición de un destructor también crea el vtable 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 ¿Qué debo hacer con este extraño error? que parece ser un duplicado).


Si Obstacle es una clase base abstracta, asegúrese de declarar todos sus métodos virtuales como "puros virtuales":

virtual void Method() = 0;

The = 0 le dice al compilador que este método debe ser reemplazado por una clase derivada, y puede que no tenga su propia implementación.

Si la clase contiene funciones virtuales no puras, el compilador supondrá que tienen una implementación en alguna parte, y sus estructuras internas (vtable y typeinfo) pueden generarse 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.


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.

Los 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.