簡體   English   中英

C ++共享庫中基類的未定義符號錯誤

[英]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,它有三個函數initcleanupbar

當我嘗試加載共享庫(在R使用dyn.load )時,我收到一個錯誤:

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

所以,它似乎無法找到Foo構造函數。 我做錯了什么,如何解決?

更新 :謝謝,jbar! 所以它是Foo de structor。 我可以從錯誤消息中的神秘符號中知道這個: _ZN3FooD2Ev嗎? FooDD代表析構函數嗎?

更新:所以它是Foo析構函數。 我可以從錯誤消息中的神秘符號中知道這個:_ZN3FooD2Ev嗎? FooD中的D代表析構函數嗎?

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

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

我們不能聲明純虛析構函數。 即使虛擬析構函數被聲明為純粹的,它也必須為析構函數實現一個空體(至少)。

鑒於您的更新,“_ ZN3FooD2Ev”是“Foo ::〜Foo()” 損壞

看看“demangle”計划。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM