2010-12-08 4 views
1

Я пишу простой игровой движок, и у меня есть файл EntityComponent.h:символ не найден связывающая библиотеки

#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 

и относительный файл EntityComponent.cpp:

#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; 
} 

Эти два файла являются частью структуры (я работаю на Mac). Они хорошо компилируются. Проблема заключается в том, когда я пишу исполняемый файл, который использует библиотеку. Я создал подкласс класса EntityComponent и компилируется. Но, если я назову функцию getName(), компоновщик скажет мне:

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

Что я могу сделать? Спасибо.

+0

осуществляете ли вы все абстрактные виртуальные методы, заданные в интерфейсе? – 2010-12-08 19:05:42

+1

Может помочь, если вы включите свои команды компиляции/ссылки. – 2010-12-08 19:06:14

ответ

3

Поместите код для встроенной функции в файл заголовка, если вы хотите ссылаться на него из нескольких файлов .cpp.

Ссылка here.

+0

Это работает, спасибо;) – Sigel 2010-12-09 09:49:56

0

Ваш (немного изменено, чтобы включить подкласс текста) код компилируется отлично на моей машине (A Mac, тоже. GCC 4.2.1)

Попробуйте удалить все .o-файлы и компилировать с чистым каталогом. Если это не удается, я попытаюсь удалить встроенное определение.

0

Попробуйте удалить квалификатор inline из вашей реализации.

2

Внешняя связь inline Функция должна быть определена (как фактически одинаково) в каждой единицы перевода, где она используется.

Так что либо удалите inline из определения, либо поместите определение в файл заголовка.

Приветствия & НТН.,

Смежные вопросы