Frage

ich der folgende Code als gemeinsam genutzte Bibliothek mit g++ -shared ... zusammengestellt:

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(); }
}

Der Punkt ist, die Funktionalität meiner Klassen (hier nur minimal Spielzeug Klassen als Beispiel) als ein einfacher C API mit der drei Funktionen init, cleanup und bar zu belichten.

Wenn ich versuche, die gemeinsam benutzte Bibliothek (mit dyn.load in R) zu laden Ich erhalte eine Fehlermeldung:

unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev

Also, es scheint sie nicht den Foo Konstruktor finden. Was mache ich falsch und wie kann dies behoben werden?

UPDATE : Danke, Jbar! So war es die Foo de structor. Habe ich dies in der Fehlermeldung aus dem kryptischen Symbol bekannt: _ZN3FooD2Ev? Hat der D in FooD für destructor stehen?

War es hilfreich?

Lösung

Wir können nicht rein virtuellen Destruktor deklarieren. Selbst wenn ein virtuelles destructor als reines deklariert ist, wird es einen leeren Körper implementieren (mindestens) für den destructor.

Andere Tipps

  

UPDATE: So war es die Foo destructor. Habe ich dies in der Fehlermeldung aus dem kryptischen Symbol bekannt: _ZN3FooD2Ev? Ist die D in der Nahrung für destructor stehen?

Sie können das Programm c ++ verwenden filt.

So c ++ filt _ZN3FooD2Ev gibt "Foo :: ~ Foo ()".

Regardring Ihr Update "_ZN3FooD2Ev" ist "Foo :: ~ Foo ()" verstümmelten .

Überprüfen Sie die "demangle" Programm aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top