我使用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,其中有三个函数 init
, cleanup
, 和 bar
.
当我尝试加载共享库(使用 R
中的 dyn.load
)时,我会收到一个错误:
unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
看起来无法找到Foo
构造函数。我做错了什么,如何修复?
更新: 谢谢,jbar! 所以是 Foo
析构函数。从错误信息中的神秘符号 _ZN3FooD2Ev
中可以知道吗?FooD
中的 D
代表析构函数吗?