3

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

ответ

7

Мы не можем объявить чистый виртуальный деструктор. Даже если виртуальный деструктор объявлен как чистый, ему придется реализовать пустое тело (по крайней мере) для деструктора.

+0

О, легкое исправление, спасибо! – Frank

+0

Как бы такое тело было реализовано? Если я реализую его для базового класса 'g ++', то жалуется на переопределение. –

13

UPDATE: So it was the Foo destructor. Could I have known this from the cryptic symbol in the error message: _ZN3FooD2Ev? Does the D in FooD stand for destructor?

Вы можете использовать программу C++ filt.

Так что C++ filt _ZN3FooD2Ev возвращает «Foo :: ~ Foo()».

+2

+1 Большое спасибо за то, что вы познакомили меня с C++ filt! – Troubadour

+0

Добро пожаловать. – Duck

+0

Ничего себе, я бы хотел знать об этом много лет назад. Спасибо!! –

2

Относительно вашего обновления «_ZN3FooD2Ev» является «Foo :: ~ Foo()» mangled.

Проверьте программу «demangle».

Смежные вопросы