[英]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.