3

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 Foode 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?

Répondre

7

Nous ne pouvons pas déclarer un destructeur virtuel pur. Même si un destructeur virtuel est déclaré pur, il devra implémenter un corps vide (au moins) pour le destructeur.

+0

Oh, une solution facile, merci! – Frank

+0

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. –

13

UPDATE: So it was the Foo destructor. Could I have known this from the cryptic symbol in the error message: _ZN3FooD2Ev? Does the D in FooD stand for destructor?

Vous pouvez utiliser le programme C++ filt.

Donc C++ filt _ZN3FooD2Ev renvoie "Foo :: ~ Foo()".

+2

+1 Merci beaucoup de me présenter à C++ filt! – Troubadour

+0

Vous êtes les bienvenus. – Duck

+0

Wow, j'aurais aimé le savoir il y a quelques années. Je vous remercie!! –

2

Concernant votre mise à jour, "_ZN3FooD2Ev" est "Foo :: ~ Foo()" mangled.

Vérifiez le programme "démon".

Questions connexes