Pregunta

I compiló el siguiente código como una biblioteca compartida utilizando 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(); }
}

El punto es exponer la funcionalidad de mis clases (aquí sólo clases de juguete mínimos como un ejemplo) como una simple API C con las tres funciones init, cleanup y bar.

Cuando intento cargar la biblioteca compartida (usando dyn.load en R) Me aparece un error:

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

Por lo tanto, parece que no puede encontrar el constructor Foo. ¿Qué estoy haciendo mal y cómo puede esto ser fijo?

Actualizar : Gracias, JBAR! Tal fue el Foo de structor. Podría haber sabido esto desde el símbolo críptico en el mensaje de error: _ZN3FooD2Ev? ¿El D en FooD reposar durante destructor?

¿Fue útil?

Solución

No podemos declarar destructor virtual puro. Incluso si un destructor virtual se declara tan puro, que tendrá que poner en práctica un cuerpo vacío (al menos) para el destructor.

Otros consejos

  

ACTUALIZACIÓN: Así fue el destructor de Foo. Podría haber sabido esto desde el símbolo críptico en el mensaje de error: _ZN3FooD2Ev? ¿El D en los alimentos reposar durante destructor?

Puede utilizar el programa c ++ filt.

Así c ++ filt _ZN3FooD2Ev devuelve "Foo Foo :: ~ ()".

Regardring su actualización, "_ZN3FooD2Ev" es "Foo Foo :: ~ ()" destrozado .

Consulte el programa "demangle".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top