2010-12-08 28 views
1

J'écris un simple moteur de jeu, et je le fichier EntityComponent.h:Symbole non trouvé reliant une bibliothèque

#ifndef Psycho2D_Core_EntityComponent_ 
#define Psycho2D_Core_EntityComponent_ 

#include <string> 

namespace psycho2d{ 

    class EntityComponent{ 

    private: 
     std::string m_name; 

    public: 
     EntityComponent(const std::string &name); 

     virtual ~EntityComponent(); 

     const std::string& getName() const; 

     virtual void initialize() = 0; 

     virtual void loadProperties() = 0;  

     virtual void update() = 0; 

     virtual void destroy() = 0; 

    }; 

} 

#endif 

Et le fichier EntityComponent.cpp relatif:

#include "EntityComponent.h" 
#include <string> 

psycho2d::EntityComponent::EntityComponent(const std::string &name){ 
    this->m_name = name; 
} 

psycho2d::EntityComponent::~EntityComponent(){} 

inline const std::string& psycho2d::EntityComponent::getName() const{ 
    return this->m_name; 
} 

Ces deux fichiers font partie d'un framework (je travaille sur un Mac). Ils compilent bien. Le problème est lorsque j'écris un exécutable qui utilise la bibliothèque. J'ai créé une sous-classe de EntityComponent, et elle compile. Mais, si je l'appelle la fonction getName(), l'éditeur de liens me dire:

"psycho2d::EntityComponent::getName() const", referenced from: 
_main in main.o 
Symbol(s) not found 
Collect2: ld returned 1 exit status 

Qu'est-ce que je peux faire? Merci.

+0

Avez-vous mis en œuvre toutes les méthodes virtuelles abstraites que vous avez spécifié dans votre interface? –

+1

Peut aider si vous incluez vos commandes de compilation/liaison. –

Répondre

3

Placez le code de la fonction inline dans le fichier d'en-tête, si vous souhaitez le référencer à partir de plusieurs fichiers .cpp.

Référence here.

+0

Cela fonctionne, merci;) – Sigel

0

Votre (légèrement modifié pour inclure une sous-classe au texte) code compile bien sur ma machine (un Mac aussi. GCC 4.2.1)

Essayez de supprimer tous les fichiers .o et compiler avec un répertoire propre. Si cela échoue aussi, j'essayerais de supprimer la définition inline.

0

Essayez de supprimer le qualificatif inline de votre implémentation.

2

Une fonction de liaison externe inline doit être définie (de manière identique) dans chaque unité de traduction où elle est utilisée.

Donc soit supprimer le inline de la définition, ou placez la définition dans le fichier d'en-tête.

Vive & HTH.,

+0

+1 pour expliquer pourquoi –