Pergunta

Eu compilei o seguinte código como uma biblioteca compartilhada usando 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(); }
}

O objetivo é expor a funcionalidade das minhas aulas (aqui classes de brinquedo apenas o mínimo como um exemplo) como uma simples API C com as três funções init, cleanup e bar.

Quando tento carregar a biblioteca compartilhada (usando dyn.load em R) eu recebo um erro:

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

Assim, parece que não consegue encontrar o construtor Foo. O que estou fazendo de errado e como isso pode ser corrigido?

Atualização : Obrigado, jbar! Por isso, foi a Foo de structor. Eu poderia ter conhecido este a partir do símbolo críptico na mensagem de erro: _ZN3FooD2Ev? Será que o D em stand FooD para destructor?

Foi útil?

Solução

Não podemos declarar destruidor virtual puro. Mesmo se um destrutor virtual é declarada como puro, ele terá que implementar um corpo vazio (pelo menos) para o destruidor.

Outras dicas

UPDATE: Então foi o destruidor Foo. Eu poderia ter conhecido este a partir do símbolo críptico na mensagem de erro: _ZN3FooD2Ev? A D em alimentos representam destruidor?

Você pode usar o programa c ++ filt.

Assim c ++ filt _ZN3FooD2Ev retornos "Foo :: ~ Foo ()".

Regardring sua atualização, "_ZN3FooD2Ev" é "Foo :: ~ Foo ()" mutilado .

Confira o programa "demangle".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top