C ++共享库中基类的未定义符号错误

时间:2009-07-11 16:51:22

标签: c++ compilation linker-errors shared-libraries undefined-symbol

我使用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(); }
}

重点是将我的类的功能(这里只是最小的玩具类作为示例)公开为一个简单的C API,其中包含三个函数initcleanup和{ {1}}。

当我尝试加载共享库时(使用bar中的dyn.load)我收到错误:

R

所以,它似乎无法找到unable to load shared library 'test.so': test.so: undefined symbol: _ZN3FooD2Ev 构造函数。我做错了什么以及如何解决这个问题?

更新:谢谢,jbar!所以它是Foo de 结构。我可以通过错误消息中的神秘符号知道这一点:Foo吗? _ZN3FooD2Ev中的D是否代表析构函数?

3 个答案:

答案 0 :(得分:13)

  

更新:所以它是Foo析构函数。我可以从错误消息中的神秘符号中知道这个:_ZN3FooD2Ev吗? FooD中的D代表析构函数吗?

您可以使用程序c ++ filt。

所以c ++ filt _ZN3FooD2Ev返回“Foo :: ~Foo()”。

答案 1 :(得分:8)

我们不能声明纯虚析构函数。即使虚拟析构函数被声明为纯粹的,它也必须为析构函数实现一个空体(至少)。

答案 2 :(得分:3)

考虑到您的更新,“_ ZN3FooD2Ev”是“Foo :: ~Foo()”mangled

查看“demangle”计划。