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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top