2009-11-07 4 views
3

Tout fonctionne, sauf cette erreur de symboles non définis:Symboles non définis. ld: symbole non trouvé

bash-3.2$ make 
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o Worl.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem 

`Undefined symbols: 
    "Obstacle::~Obstacle()", referenced from: 
     Myworld::~Myworld()in Myworld.o 
     Myworld::~Myworld()in Myworld.o 
     Myworld::~Myworld()in Myworld.o 
    "RECTANGLE::RECTANGLE()", referenced from: 
     Myworld::readObstacles(std::basic_istream<char, std::char_traits<char> >& 
in Myworld.o 
    "CIRCLE::CIRCLE()", referenced from: 
     Myworld::readObstacles(std::basic_istream<char, std::char_traits<char> >& 
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` 

Il est une telle erreur étrange. Quelque chose ne va pas avec le constructeur ou le destructeur? Tout conseil vous aidera.

Après avoir ajouté {} après tous les constructeurs et destructeurs que l'erreur a été réduit à :

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 
+1

Il est difficile d'y répondre sans voir de code. Avez-vous fourni des implémentations pour ces destructeurs, etc.? –

+0

quelle est la mise en œuvre du desctructor? Je n'ai rien fait dans le ~ Obstacle(); – Lisa

+0

Je pense qu'il essaye de compiler quelque chose qui embarque une bibliothèque personnalisée .. et gcc ne la trouve pas (ou la construit) pour une raison quelconque .. et la construction ne se casse pas au moment approprié. –

Répondre

1

On dirait que vous manquez la mise en œuvre de la desctructor ~Obstacle qui est défini de toute façon ..

LD est l'éditeur de liens, cela signifie que tout se compile bien, mais quand il commence à lier des binaires en un, il ne peut pas trouver le destructeur pour Obstacle utilisé dans votre code ..

Ajouter

~Obstacle() {} 

à votre définition de la classe dans le fichier .h, ou si vous préférez définir simplement ~Obstacle() et de fournir la mise en œuvre dans .cpp fichier comme ~Obstacle::Obstacle()

+0

pouvez-vous me dire comment faire la destruction? Class Obstacle est la classe de base avec deux sous-classes CIRCLE et RECTANGLE. – Lisa

+0

Ok, vous devriez utiliser une destruction virtuelle dans votre classe de base et l'implémenter dans les sous-classes. Pourriez-vous s'il vous plaît modifier votre question et ajouter du code? ce serait utile .. – Jack

+0

J'ai déjà le ~ Obstacle(); dans Obstacle.h. Mais encore le problème – Lisa

0

il semble aussi que les constructeurs par défaut sont absents de RECTANGLE et CIRCLE.

+0

il y a ~ RECTANGLE et ~ CIRCLE dans les deux fichiers .h. que voulez-vous dire par manque – Lisa

+0

Il dit que 'RECTANGLE :: RECTANGLE' est manquant. C'est le constructeur, pas le destructeur. Idem pour CERCLE. –

+0

comme dit plus haut, tous les constructeurs et déconstructeurs ont été modifiés et l'erreur a été réduite à deux problèmes – Lisa

0

Il vous manque une bibliothèque. ou avoir une chaîne d'outils cassée (qui dépend du chemin d'inclusion pour gcc).

Google relevai squat .. donc préciser ce que vous êtes réellement essayer de construire nous permet de vous aider plus :)

1

Il pourrait être que vous avez déclaré le tor D'mais n'a pas le mettre en œuvre. Essayez de mettre {} dans le fichier .h, ou:

Obstacle::~Obstacle() 
{ 
} 

dans le cpp.

+0

quelle est la signification acturielle de "typeinfo pour Obstacle" et "vtable pour Obstacle" – Lisa

+0

Lisa, ces messages concernent la virtualisation. Le vtable fait référence à la "table virtuelle", c'est une table qui contient les adresses de fonction d'un objet dans un arbre d'héritage, pour savoir à quelle implémentation aller (à cause de l'overriding et ainsi de suite). Jetez un coup d'oeil ici: http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/ Peut-être que si vous intégrez votre code ici, je pourrais être plus utile –

+0

Vous pouvez avoir une autre méthode virtuelle qui n'est pas implémenté dans une classe de base ni dans ses héritants. Je passerais en revue le code et vérifierais les méthodes non implémentées dans vos classes, probablement dans Obstacle et ses héritants. –

10

L'éditeur de liens ne trouve pas le destructeur pour la classe Obstacle. Est-ce dans un autre fichier objet (peut-être Obstacle.o)?

Si c'est le cas, ajoutez-le à la liste des objets à lier.

Est-il supposé être un destructeur virtuel vide dans la définition de classe? Dans ce cas, assurez-vous que vous avez écrit

virtual ~Obstacle() {} 

et non

virtual ~Obstacle(); 

Le premier met en œuvre les destructor; la seconde déclare qu'elle existe, mais est implémentée ailleurs.

+0

J'ajoute {} dans et l'erreur est réduite à "typeinfo pour Obstacle", référencé de: typeinfo pour RECTANGLE dans RECTANGLE.o typeinfo pour CIRCLEin CIRCLE.o ld: symbole (s) pas trouvé collect2: ld retourné 1 sortie état make: – Lisa

+0

Voir ma réponse à votre autre question. –

+0

Ceci est un point très pertinent. J'ai passé plusieurs heures à essayer de retrouver une erreur de lien "symbols not found in vtable" pour une méthode dans une classe modélisée où la méthode était définie dans le fichier d'en-tête - impossible que la classe/méthode instanciée ne soit pas compilée. La classe a également dérivé d'un parent. Ce n'est que lorsque j'ai déclaré les destructeurs virtuels (même si leurs corps sont vides) que ce bug a été corrigé. –

Questions connexes