Undefined symbol error for base class in C++ shared library

c++, compilation, linker-errors, shared-libraries, undefined-symbol

Solution

We can't declare pure virtual destructor. Even if a virtual destructor is declared as pure, it will have to implement an empty body (at least) for the destructor.

Problem

I compiled the following code as a shared library using `g++ -shared ...`: ``` class Foo { public: Foo() {} virtual ~Foo() = 0; virtual int Bar() = 0; }; class TestFoo : public Foo { public: int Bar() { return 0; } }; extern "C" { Foo* foo; void init() { // Runtime error: undefined symbol: _ZN3FooD2Ev foo = new TestFoo(); // causes error } void cleanup() { delete(foo); } void bar() { foo->Bar(); } } ``` The point is to expose the functionality of my classes (here just minimal toy classes as an example) as a simple `C` API with the three functions `init`, `cleanup`, and `bar`. When I try to load the shared library (using `dyn.load` in `R`) I get an error: ``` unable to load shared library 'test.so': test.so: undefined symbol: _ZN3FooD2Ev ``` So, it seems it cannot find the `Foo` constructor. What am I doing wrong and how can this be fixed? UPDATE: Thanks, jbar! So it was the `Foo` destructor. Could I have known this from the cryptic symbol in the error message: `_ZN3FooD2Ev`? Does the `D` in `FooD` stand for destructor?

Original source