Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undefined reference to vtable

Tags:

c++

gcc

g++

When building my C++ program, I'm getting the error message

undefined reference to 'vtable...

What is the cause of this problem? How do I fix it?


It so happens that I'm getting the error for the following code (The class in question is CGameModule.) and I cannot for the life of me understand what the problem is. At first, I thought it was related to forgetting to give a virtual function a body, but as far as I understand, everything is all here. The inheritance chain is a little long, but here is the related source code. I'm not sure what other information I should provide.

Note: The constructor is where this error is happening, it'd seem.

My code:

class CGameModule : public CDasherModule {  public:   CGameModule(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CDasherInterfaceBase *pInterface, ModuleID_t iID, const char *szName)   : CDasherModule(pEventHandler, pSettingsStore, iID, 0, szName)   {        g_pLogger->Log("Inside game module constructor");          m_pInterface = pInterface;    }    virtual ~CGameModule() {};    std::string GetTypedTarget();    std::string GetUntypedTarget();    bool DecorateView(CDasherView *pView) {       //g_pLogger->Log("Decorating the view");       return false;   }    void SetDasherModel(CDasherModel *pModel) { m_pModel = pModel; }     virtual void HandleEvent(Dasher::CEvent *pEvent);    private:      CDasherNode *pLastTypedNode;     CDasherNode *pNextTargetNode;     std::string m_sTargetString;     size_t m_stCurrentStringPos;     CDasherModel *m_pModel;     CDasherInterfaceBase *m_pInterface; }; 

Inherits from...

class CDasherModule; typedef std::vector<CDasherModule*>::size_type ModuleID_t;  /// \ingroup Core /// @{ class CDasherModule : public Dasher::CDasherComponent {  public:   CDasherModule(Dasher::CEventHandler * pEventHandler, CSettingsStore * pSettingsStore, ModuleID_t iID, int iType, const char *szName);    virtual ModuleID_t GetID();   virtual void SetID(ModuleID_t);   virtual int GetType();   virtual const char *GetName();    virtual bool GetSettings(SModuleSettings **pSettings, int *iCount) {     return false;   };   private:   ModuleID_t m_iID;   int m_iType;   const char *m_szName; }; 

Which inherits from....

namespace Dasher {   class CEvent;   class CEventHandler;   class CDasherComponent; };  /// \ingroup Core /// @{ class Dasher::CDasherComponent {  public:   CDasherComponent(Dasher::CEventHandler* pEventHandler, CSettingsStore* pSettingsStore);   virtual ~CDasherComponent();    void InsertEvent(Dasher::CEvent * pEvent);   virtual void HandleEvent(Dasher::CEvent * pEvent) {};    bool GetBoolParameter(int iParameter) const;   void SetBoolParameter(int iParameter, bool bValue) const;    long GetLongParameter(int iParameter) const;   void SetLongParameter(int iParameter, long lValue) const;    std::string GetStringParameter(int iParameter) const;   void        SetStringParameter(int iParameter, const std::string & sValue) const;    ParameterType   GetParameterType(int iParameter) const;   std::string     GetParameterName(int iParameter) const;   protected:   Dasher::CEventHandler *m_pEventHandler;   CSettingsStore *m_pSettingsStore; }; /// @}   #endif 
like image 220
RyanG Avatar asked Jun 17 '10 19:06

RyanG


People also ask

What does undefined reference to vtable mean?

In summary, there are three key causes of the "undefined reference to vtable" error: A member function is missing its definition. An object file is not being linked. All virtual functions have inline definitions.

What is a vtable C++?

For every class that contains virtual functions, the compiler constructs a virtual table, a.k.a vtable. The vtable contains an entry for each virtual function accessible by the class and stores a pointer to its definition. Only the most specific function definition callable by the class is stored in the vtable.

How do you fix undefined references to Main?

When we compile these files separately, the first file gives “undefined reference” for the print function, while the second file gives “undefined reference” for the main function. The way to resolve this error is to compile both the files simultaneously (For example, by using g++).

What is a virtual destructor C++?

A virtual destructor is used to free up the memory space allocated by the derived class object or instance while deleting instances of the derived class using a base class pointer object.


2 Answers

The GCC FAQ has an entry on it:

The solution is to ensure that all virtual methods that are not pure are defined. Note that a destructor must be defined even if it is declared pure-virtual [class.dtor]/7.

Therefore, you need to provide a definition for the virtual destructor:

virtual ~CDasherModule() { } 
like image 50
Alexandre Hamez Avatar answered Sep 27 '22 20:09

Alexandre Hamez


For what it is worth, forgetting a body on a virtual destructor generates the following:

undefined reference to `vtable for CYourClass'.

I am adding a note because the error message is deceptive. (This was with gcc version 4.6.3.)

like image 36
Dan Avatar answered Sep 27 '22 19:09

Dan