4

我使用以下代码将以下代码编译为共享库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(); }
}

重点是将我的类(这里只是最小的玩具类作为示例)的功能公开为具有三个函数、和的简单CAPI 。initcleanupbar

当我尝试加载共享库(使用dyn.loadin R)时,出现错误:

unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev

所以,它似乎找不到Foo构造函数。我做错了什么,如何解决?

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

4

3 回答 3

15

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

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

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

于 2009-07-11T23:31:47.950 回答
9

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

于 2009-07-11T16:56:44.957 回答
3

关于您的更新, "_ZN3FooD2Ev" 是 "Foo::~Foo()" mangled

查看“demangle”程序。

于 2009-07-11T23:41:14.017 回答