Undefinierte Symbolfehler für die Basisklasse in C ++ Shared Library
-
12-09-2019 - |
Frage
ich der folgende Code als gemeinsam genutzte Bibliothek mit g++ -shared ...
zusammengestellt:
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(); }
}
Der Punkt ist, die Funktionalität meiner Klassen (hier nur minimal Spielzeug Klassen als Beispiel) als ein einfacher C
API mit der drei Funktionen init
, cleanup
und bar
zu belichten.
Wenn ich versuche, die gemeinsam benutzte Bibliothek (mit dyn.load
in R
) zu laden Ich erhalte eine Fehlermeldung:
unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
Also, es scheint sie nicht den Foo
Konstruktor finden. Was mache ich falsch und wie kann dies behoben werden?
UPDATE : Danke, Jbar! So war es die Foo
de structor. Habe ich dies in der Fehlermeldung aus dem kryptischen Symbol bekannt: _ZN3FooD2Ev
? Hat der D
in FooD
für destructor stehen?
Lösung
Wir können nicht rein virtuellen Destruktor deklarieren. Selbst wenn ein virtuelles destructor als reines deklariert ist, wird es einen leeren Körper implementieren (mindestens) für den destructor.
Andere Tipps
UPDATE: So war es die Foo destructor. Habe ich dies in der Fehlermeldung aus dem kryptischen Symbol bekannt: _ZN3FooD2Ev? Ist die D in der Nahrung für destructor stehen?
Sie können das Programm c ++ verwenden filt.
So c ++ filt _ZN3FooD2Ev gibt "Foo :: ~ Foo ()".
Regardring Ihr Update "_ZN3FooD2Ev" ist "Foo :: ~ Foo ()" verstümmelten .
Überprüfen Sie die "demangle" Programm aus.