Errore di simbolo non definito per la classe di base in C ++ libreria condivisa
-
12-09-2019 - |
Domanda
Ho compilato il seguente codice come una libreria condivisa utilizzando 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(); }
}
Il punto è quello di esporre la funzionalità delle mie classi (qui solo classi giocattolo minime come esempio) come un semplice API C
con tre funzioni init
, cleanup
e bar
.
Quando provo a caricare la libreria condivisa (utilizzando dyn.load
in R
) ottengo un errore:
unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
Quindi, a quanto pare non riesce a trovare il costruttore Foo
. Che cosa sto facendo di sbagliato e come può essere risolto?
UPDATE : Grazie, Jbar! Così è stato il Foo
de structor. Potrei Ho conosciuto questo dal simbolo criptico nel messaggio di errore: _ZN3FooD2Ev
? Fa il D
in FooD
riposare per distruttore?
Soluzione
Non possiamo dichiarare distruttore virtuale pura. Anche se un distruttore virtuale è dichiarato come puro, dovrà attuare un corpo vuoto (almeno) per il distruttore.
Altri suggerimenti
UPDATE: Così è stato il distruttore Foo. Potrei Ho conosciuto questo dal simbolo criptico nel messaggio di errore: _ZN3FooD2Ev? Fa il D in stand gastronomico per distruttore?
È possibile utilizzare il programma c ++ filt.
Quindi c ++ filt _ZN3FooD2Ev restituisce "Pippo :: ~ Foo ()".
Regardring l'aggiornamento, "_ZN3FooD2Ev" è "Pippo :: ~ Foo ()" maciullato .
Vedi il programma "demangle".