C ++共有ライブラリのベースクラスの未定義のシンボルエラー
-
12-09-2019 - |
質問
私は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つの関数C
、init
、およびcleanup
とシンプルなbar
のAPIとして私のクラス(例として、ここでは単に、最小限のおもちゃのクラス)の機能を公開することです。
私は(dyn.load
でR
を使用して)共有ライブラリをロードしようとすると、私はエラーを取得します:
unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
だから、Foo
コンストラクタを見つけることができないようです。何を私が間違ってやっているとどのようにこれを固定することができますか?
UPDATE の:おかげで、jbar!だから、Foo
のデのstructorました。 _ZN3FooD2Ev
:私は、エラーメッセージの不可解な記号からこれを知っているだろうか? D
でFooD
はデストラクタを表していますか?
解決
私たちは純粋仮想デストラクタを宣言することはできません。仮想デストラクタが純粋として宣言されている場合でも、それはデストラクタのための空の体を(少なくとも)実装する必要があります。
他のヒント
UPDATE:だから、Fooのデストラクタでした。 _ZN3FooD2Ev:私は、エラーメッセージの不可解な記号からこれを知っているだろうか?食品中のDは、デストラクタを表していますか?
あなたはプログラムC ++ FILTを使用することができます。
"はFoo ::〜Fooのを()" を返し++ FILT _ZN3FooD2Evので、cます。
あなたの更新をRegardring、 "_ZN3FooD2Evは" "はFoo ::〜Fooの()" マングルされた。
"デマングル" プログラムをチェックします。
所属していません StackOverflow