Erreur non définie symbole pour la classe de base dans la bibliothèque partagée C de
-
12-09-2019 - |
Question
Je compilé le code suivant comme une bibliothèque partagée en utilisant 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(); }
}
Le point est d'exposer la fonctionnalité de mes cours (ici seulement classes de jouets minimales à titre d'exemple) comme une simple API C
avec les trois fonctions init
, cleanup
et bar
.
Lorsque je tente de charger la bibliothèque partagée (en utilisant dyn.load
dans R
) Je reçois une erreur:
unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
Alors, il semble qu'il ne peut pas trouver le constructeur Foo
. Qu'est-ce que je fais mal et comment cela peut-il être fixé?
UPDATE : Merci, JBAR! Ainsi, il a été le Foo
de structor. Aurais-je su ce symbole du cryptique dans le message d'erreur: _ZN3FooD2Ev
? Le D
en FooD
reposer destructor?
La solution
Nous ne pouvons pas déclarer destructor virtuelle pure. Même si un destructeur virtuel est déclaré pur, il devra mettre en place un corps vide (au moins) pour le destructor.
Autres conseils
Mise à jour: Il a été le Foo destructor. Aurais-je su ce symbole du cryptique dans le message d'erreur: _ZN3FooD2Ev? Le D pour stand de nourriture destructor?
Vous pouvez utiliser le programme c ++ filt.
c ++ filt _ZN3FooD2Ev retourne "Foo :: ~ Foo ()".
Regardring votre mise à jour, "_ZN3FooD2Ev" est "Foo :: ~ Foo ()" déchiqueté .
Consultez le programme "demangle".