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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top