خطأ رمز غير محدد للفئة الأساسية في مكتبة 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
البناء. ماذا أفعل الخطأ وكيف يمكن إصلاح ذلك؟
تحديث: شكرا، JBAR! لذلك كان Foo
فيهيكلة. هل يمكن أن أعرف هذا من الرمز الخبيئ في رسالة الخطأ: _ZN3FooD2Ev
ب هل D
في FooD
الوقوف للمدير؟
المحلول
لا يمكننا إعلان تدمير افتراضي نقي. حتى إذا تم الإعلان عن المدمرة الافتراضية كافية، فسيتعين عليها تنفيذ جسم فارغ (على الأقل) للمدير.
نصائح أخرى
تحديث: لذلك كان destructor فو. هل يمكن أن أعرف هذا من الرمز المخفري في رسالة الخطأ: _zn3food2ev؟ هل د في الغذاء يقف للمدير؟
يمكنك استخدام البرنامج C ++ FILT.
لذلك C ++ Filt _zn3food2ev إرجاع "Foo :: ~ Foo ()".
فيما يتعلق التحديث الخاص بك، "_zn3food2ev" هو "FOO :: ~ FOO ()" مانج.
تحقق من برنامج "demangle".