Ошибка неопределенного символа для базового класса в разделяемой библиотеке C ++
-
12-09-2019 - |
Вопрос
Я скомпилировал следующий код как общую библиотеку, используя 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
конструктор.Что я делаю не так и как это можно исправить?
Обновить:Спасибо, джбар!Итак , это был Foo
deконструктор.Мог ли я узнать это из загадочного символа в сообщении об ошибке: _ZN3FooD2Ev
?Делает ли D
в FooD
расшифровывается как деструктор?
Решение
Мы не можем объявить чистый виртуальный деструктор.Даже если виртуальный деструктор объявлен как чистый, ему придется реализовать пустое тело (по крайней мере) для деструктора.
Другие советы
Обновить:Итак, это был деструктор Foo.Мог ли я узнать это из загадочного символа в сообщении об ошибке:_ZN3FooD2Ev?Означает ли буква D в FooD деструктор?
Вы можете использовать программу c++filt.
Таким образом, c ++ filt _ZN3FooD2Ev возвращает "Foo::~Foo()".
Что касается вашего обновления, "_ZN3FooD2Ev" - это "Foo::~Foo()". искалеченный.
Ознакомьтесь с программой "demangle".