我使用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
和{ {1}}。
当我尝试加载共享库时(使用bar
中的dyn.load
)我收到错误:
R
所以,它似乎无法找到unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
构造函数。我做错了什么以及如何解决这个问题?
更新:谢谢,jbar!所以它是Foo
de 结构。我可以通过错误消息中的神秘符号知道这一点:Foo
吗? _ZN3FooD2Ev
中的D
是否代表析构函数?
答案 0 :(得分:13)
更新:所以它是Foo析构函数。我可以从错误消息中的神秘符号中知道这个:_ZN3FooD2Ev吗? FooD中的D代表析构函数吗?
您可以使用程序c ++ filt。
所以c ++ filt _ZN3FooD2Ev返回“Foo :: ~Foo()”。
答案 1 :(得分:8)
我们不能声明纯虚析构函数。即使虚拟析构函数被声明为纯粹的,它也必须为析构函数实现一个空体(至少)。
答案 2 :(得分:3)
考虑到您的更新,“_ ZN3FooD2Ev”是“Foo :: ~Foo()”mangled。
查看“demangle”计划。