Я скомпилировал следующий код в качестве разделяемой библиотеки, используя 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
de конструктор. Мог ли я узнать это по загадочному символу в сообщении об ошибке: _ZN3FooD2Ev
? D
in FooD
означает деструктор?