質問

私は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(); }
}

のポイントは3つの関数Cinit、およびcleanupとシンプルなbarのAPIとして私のクラス(例として、ここでは単に、最小限のおもちゃのクラス)の機能を公開することです。

私は(dyn.loadRを使用して)共有ライブラリをロードしようとすると、私はエラーを取得します:

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

だから、Fooコンストラクタを見つけることができないようです。何を私が間違ってやっているとどのようにこれを固定することができますか?

UPDATE の:おかげで、jbar!だから、Foo のデのstructorました。 _ZN3FooD2Ev:私は、エラーメッセージの不可解な記号からこれを知っているだろうか? DFooDはデストラクタを表していますか?

役に立ちましたか?

解決

私たちは純粋仮想デストラクタを宣言することはできません。仮想デストラクタが純粋として宣言されている場合でも、それはデストラクタのための空の体を(少なくとも)実装する必要があります。

他のヒント

  

UPDATE:だから、Fooのデストラクタでした。 _ZN3FooD2Ev:私は、エラーメッセージの不可解な記号からこれを知っているだろうか?食品中のDは、デストラクタを表していますか?

あなたはプログラムC ++ FILTを使用することができます。

"はFoo ::〜Fooのを()" を返し++ FILT _ZN3FooD2Evので、cます。

あなたの更新をRegardring、 "_ZN3FooD2Evは" "はFoo ::〜Fooの()" マングルされた。

"デマングル" プログラムをチェックします。

scroll top