Я составил следующий код, совместно используемую библиотеку, используя g++ -shared ...
:Неизвестная ошибка символ для базового класса в общей библиотеке C++
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
de structor. Мог ли я узнать это из загадочного символа в сообщении об ошибке: _ZN3FooD2Ev
? Есть ли D
в FooD
подставка для деструктора?
О, легкое исправление, спасибо! – Frank
Как бы такое тело было реализовано? Если я реализую его для базового класса 'g ++', то жалуется на переопределение. –