web-dev-qa-db-fra.com

Symboles non définis "vtable pour ..." et "typeinfo pour ..."?

Presque la dernière étape mais encore quelques erros étranges ....

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

Quelle est la signification de vtable et typeinfo?

43
Lisa

Si Obstacle est une classe de base abstraite, assurez-vous de déclarer toutes ses méthodes virtuelles "pure virtuelle":

virtual void Method() = 0;

Le = 0 indique au compilateur que cette méthode doit être remplacée par une classe dérivée et peut ne pas avoir sa propre implémentation.

Si la classe contient des fonctions virtuelles non pures, le compilateur supposera qu'elles ont une implémentation quelque part, et ses structures internes (vtable et typeinfo) peuvent être générées dans le même fichier objet que l'un d'entre eux; si ces fonctions ne sont pas implémentées, alors les structures internes seront manquantes et vous obtiendrez ces erreurs.

83
Mike Seymour

La classe Obstacle a besoin d'un destructeur virtuel. Remplacez la définition du destructeur par:

virtual ~Obstacle();

La définition d'un destructeur crée également la table virtuelle pour une classe avec des fonctions virtuelles. Il garantit également qu'une suppression d'une instance de classe dérivée via un pointeur de classe de base fait la bonne chose.

(copie de ma réponse à la question Que dois-je faire avec cette étrange erreur? qui semble être un doublon.)

6
janm

As-tu un Obstacle.cc fichier? Si tel est le cas, vous devez vous assurer qu'il est intégré à Obstacle.o, et cela Obstacle.o est ajouté à la ligne de commande lorsque vous liez votre programme.

Assurez-vous également que vous définissez toutes les méthodes virtuelles non pures que vous déclarez. Si vous déclarez un destructeur virtuel pur, vous devez également le définir.

3
bk1e

Il y a une autre raison pour laquelle vous pouvez obtenir cette erreur, et je veux juste la documenter ici. Je faisais un lien avec une bibliothèque statique qui n'avait pas de RTTI. Donc, en utilisant l'indicateur C++ -fno-rtti corrigé pour moi. Si vous n'avez pas besoin de RTTI, vous pouvez également utiliser cet indicateur. J'espère que cela t'aides.

1
vine'th

vtable et typeinfo sont des structures internes générées par le compilateur C++. vtable est utilisé pour appeler des fonctions virtuable et typeinfo est utilisé pour RTTI.

Différents compilateurs ont différentes stratégies pour générer ces structures. Une stratégie que j'ai vue est qu'ils généreront la table dans le même fichier objet qui contient la première fonction virtuelle de la classe.

1