erro de símbolo indefinido para classe base em C ++ biblioteca compartilhada
-
12-09-2019 - |
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?
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".