سؤال

قمت بتجميع التعليمات البرمجية التالية ككتبة مشتركة باستخدام 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".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top