Je compilé le code suivant comme une bibliothèque partagée à l'aide g++ -shared ...
:erreur de symbole non défini pour la classe de base dans la bibliothèque partagée C de
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 des classes de jouets juste minimum en tant que exemple) en tant que 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
, il semble donc qu'il ne peut pas trouver le constructeur Foo
. Qu'est-ce que je fais de mal et comment cela peut-il être réparé?
MISE À JOUR: Merci, jbar! Donc c'était le Foo
de structor. Aurais-je pu le savoir à partir du symbole cryptique dans le message d'erreur: _ZN3FooD2Ev
? Est-ce que le D
dans FooD
signifie destructeur?
Oh, une solution facile, merci! – Frank
Comment un tel organisme serait-il mis en œuvre? Si je l'implémente pour la classe de base, g ++ se plaint d'une redéfinition. –