Неопределенная ошибка символа для базового класса в общей библиотеке C++
Я скомпилировал следующий код как общую библиотеку, используя 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(); }
}
Суть в том, чтобы раскрыть функциональность моих классов (здесь в качестве примера приведены лишь минимальные классы игрушек) в виде простого C
API с тремя функциями init
, cleanup
, а также bar
,
Когда я пытаюсь загрузить общую библиотеку (используя dyn.load
в R
) Я получаю ошибку:
unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev
Таким образом, кажется, он не может найти Foo
конструктор. Что я делаю не так и как это можно исправить?
ОБНОВЛЕНИЕ: Спасибо, JBAR! Так было Foo
де структор. Мог ли я узнать это по загадочному символу в сообщении об ошибке: _ZN3FooD2Ev
? Ли D
в FooD
стоять за деструктор?
3 ответа
Мы не можем объявить чистый виртуальный деструктор. Даже если виртуальный деструктор объявлен как чистый, ему придется реализовать пустое тело (по крайней мере) для деструктора.
ОБНОВЛЕНИЕ: Так что это был деструктор Foo. Мог ли я узнать это по загадочному символу в сообщении об ошибке: _ZN3FooD2Ev? D в FooD обозначает деструктор?
Вы можете использовать программу с ++ фильт.
Таким образом, C++ фильтр _ZN3FooD2Ev возвращает "Foo::~Foo()".
Что касается вашего обновления, "_ZN3FooD2Ev" является "Foo::~Foo()" искажено.
Проверьте программу "demangle".