[英]Undefined symbol error for base class in C++ shared library
我使用g++ -shared ...
将以下代码编译为共享库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
de structor。 我可以从错误消息中的神秘符号中知道这个: _ZN3FooD2Ev
吗? FooD
的D
代表析构函数吗?
更新:所以它是Foo析构函数。 我可以从错误消息中的神秘符号中知道这个:_ZN3FooD2Ev吗? FooD中的D代表析构函数吗?
您可以使用程序c ++ filt。
所以c ++ filt _ZN3FooD2Ev返回“Foo :: ~Foo()”。
我们不能声明纯虚析构函数。 即使虚拟析构函数被声明为纯粹的,它也必须为析构函数实现一个空体(至少)。
鉴于您的更新,“_ ZN3FooD2Ev”是“Foo ::〜Foo()” 损坏 。
看看“demangle”计划。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.