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

Frank picture Frank · Jul 11, 2009 · Viewed 8k times · Source

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?

Answer

Duck picture Duck · Jul 12, 2009

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

You can use the program c++filt.

So c++filt _ZN3FooD2Ev returns "Foo::~Foo()".