Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ a missing vtable error

Tags:

c++

I am getting a really weird error related to missing vtable for a given class constructor and destructor. Please help me to resolve this.

Undefined symbols for architecture i386:

  "vtable for A", referenced from:
      A::A() in A.o
      A::~MissionController() in A.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Code snippet;

.h file:

class A: public B

  public:
     A();
    ~A();

};

.cpp file..

 A::A()   
{


}

A::~A()
{


}
like image 234
user1908860 Avatar asked Mar 07 '13 07:03

user1908860


2 Answers

Found it,,trying with the sample, here is an exmaple.

class Shape{

public:
virtual int areas();
virtual void display();

virtual ~Shape(){};
};

The compiler complained

Undefined symbols for architecture x86_64:
"typeinfo for Shape", referenced from:
  typeinfo for trian in main_file.o
 "vtable for Shape", referenced from:
  Shape::Shape() in main_file.o
  NOTE: a missing vtable usually means the first non-inline virtual member      function has no definition.
   ld: symbol(s) not found for architecture x86_64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  make: *** [cpp_tries] Error 1enter code here

The modification is empty or any inline content inside {} next to the virtual function

class Shape{

public:
    virtual int areas(){};
    virtual void display(){};

    virtual ~Shape(){};
};

Basically, its not finding the function definition for the non-inline virtual functions.

like image 137
ravi.zombie Avatar answered Oct 24 '22 08:10

ravi.zombie


Ah! Mulling over this I think I get what is happening. I'm betting that CCNode is code which belongs to somebody else.

Any virtual functions you inherit are also virtual in the derived class... and it is common practice to make the destructor virtual... you might not realise the destructor is virtual.

Also if you are using somebody else's header file, but forgot to link to their object file, it might cause this error, as the linker would be missing the destructor of CCNode.

like image 41
Bingo Avatar answered Oct 24 '22 07:10

Bingo