47 votes

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

Presque l'étape finale mais encore quelques erreurs é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 ?

0 votes

N'oubliez pas de revenir à votre question initiale et postez du code ou répondez à certaines des questions que les gens vous ont posées. Vous obtiendrez probablement des résultats plus rapides :)

0 votes

J'ai vraiment envie de le faire mais le site n'existe pas, merci, je vais y retourner.

0 votes

Veuillez trouver la réponse ici ! stackoverflow.com/questions/1458180/

93voto

Mike Seymour Points 130519

Si Obstacle est une classe de base abstraite, veillez à déclarer toutes ses méthodes virtuelles "pure virtual" :

virtual void Method() = 0;

El = 0 indique au compilateur que cette méthode doit être surchargée par une classe dérivée, et qu'elle ne peut 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) pourraient être générées dans le même fichier objet que l'une d'entre elles ; si ces fonctions ne sont pas implémentées, alors les structures internes seront manquantes et vous obtiendrez ces erreurs.

0 votes

Je viens de rencontrer ce problème dans mon propre code. J'ai trouvé cette page par le biais d'une recherche Google, et j'ai fait le changement que vous avez indiqué et cela a réglé le problème. Merci ! :D

0 votes

Même chose que ci-dessus - trouvé sur google - a résolu le problème tout de suite, la solution était rapide et facile ! J'avais ajouté un autre membre virtuel pur à une liste de fonctions virtuelles et j'ai oublié d'ajouter le jeton = 0 ! oops

0 votes

Note : une classe abstraite peut avoir des méthodes virtuelles avec une implémentation "par défaut" (résidant dans la même classe de base) qu'une classe successeur peut ou non surcharger. Si vous souhaitez utiliser des méthodes virtuelles de ce type, procédez comme suit no les déclarer "pure virtual" (= 0) dans la classe de base.

8voto

janm Points 9310

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

virtual ~Obstacle();

La définition d'un destructeur crée aussi la vtable pour une classe avec des fonctions virtuelles. Elle garantit également que la suppression d'une instance de classe dérivée par le biais d'un pointeur de classe de base se fait correctement.

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

3 votes

Dans mon cas, non seulement j'ai dû définir le destructeur, mais j'ai également oublié de définir l'implémentation dans mon fichier cpp.

6voto

vine'th Points 2279

Il y a une autre raison pour laquelle vous pouvez obtenir cette erreur, et je veux juste la documenter ici. Je faisais une liaison avec une bibliothèque statique qui n'avait pas RTTI. Donc en utilisant le drapeau C++ -fno-rtti réparé pour moi. Si vous n'avez pas besoin de RTTI, vous pouvez également utiliser ce drapeau. J'espère que cela vous aidera.

4voto

bk1e Points 13737

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

Veillez également à définir toutes les méthodes non purement virtuelles que vous déclarez. Si vous déclarez un destructeur virtuel pur, vous devez également le définir.

0 votes

Dois-je avoir un Obstacle.cc, puisqu'il n'a que quelques fonctions virtuelles ?

0 votes

@Lisa : pas nécessairement, mais définir des méthodes/fonctions non inline et non modèle dans un fichier .h est susceptible de conduire à une erreur de linker différente (définitions multiples). Je vais donc supposer que tout ce qui se trouve dans Obstacle est inline. Avez-vous écrit des définitions pour toutes les fonctions membres d'Obstacle, y compris le(s) constructeur(s) et le destructeur ? Notez que si Obstacle a un destructeur virtuel pur, vous devez quand même écrire une définition pour celui-ci.

0 votes

Obstacle n'a-t-il que des fonctions purement virtuelles ? Oubliez ça, ça n'a pas d'importance quand il s'agit de vtables. Vous avez besoin d'un Obstacle.o pour que le compilateur ait un endroit où stocker la table virtuelle d'Obstacle et les informations sur les types.

1voto

R Samuel Klatchko Points 44549

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

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

0 votes

En ce qui concerne l'erreur ci-dessus, que signifie "symboles non définis" ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X