Monday, 31 July 2017

c++ - Undefined reference to vtable



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::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

Answer



So, I've figured out the issue and it was a combination of bad logic and not being totally familiar with the automake/autotools world. I was adding the correct files to my Makefile.am template, but I wasn't sure which step in our build process actually created the makefile itself. So, I was compiling with an old makefile that had no idea about my new files whatsoever.



Thanks for the responses and the link to the GCC FAQ. I will be sure to read that to avoid this problem occurring for a real reason.


No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...