سؤال

أثناء تجميع AVR-GCC، واجهت أخطاء رابط مثل ما يلي:

undefined reference to `__cxa_pure_virtual'

لقد وجدت هذا المستند التي تنص على:

ال __cxa_pure_virtual الوظيفة هي معالج خطأ يتم استدعاءها عند استدعاء وظيفة افتراضية نقية.

إذا كنت تكتب تطبيق C ++ يحتوي على وظائف افتراضية نقية يجب عليك تزويدها بنفسك __cxa_pure_virtual خطأ معالج الخطأ. علي سبيل المثال:

extern "C" void __cxa_pure_virtual() { while (1); }

تحديد هذه الوظيفة كما هو مقترح إصلاح الأخطاء ولكن أود أن أعرف:

  • ما الغرض من هذه الوظيفة هو،
  • لماذا يجب أن أحتاج إلى تحديد ذلك بنفسي و
  • لماذا من المقبول كودها كحلقة لانهائية؟
هل كانت مفيدة؟

المحلول

إذا تم إنشاء كائن في أي مكان في أي مكان في وقت تشغيلك مع مؤشر دالة افتراضية غير ملهمة، وعندما يتم استدعاء الوظيفة المقابلة، ستدعو "وظيفة افتراضية نقية".

يجب تعريف المعالج الذي تصفه في المكتبات الافتراضية التي تأتي مع بيئة التطوير الخاصة بك. إذا حدث حذف المكتبات الافتراضية، فستجد هذا المعالج غير محدد: يرى الرابط إعلان، ولكن لا يوجد تعريف. هذا عندما تحتاج إلى تقديم الإصدار الخاص بك.

الحلقة اللانهائية مقبولة لأنها خطأ "بصوت عال": سوف يلاحظ مستخدمي برنامجك على الفور. أي تنفيذ "بصوت عال" آخر مقبول أيضا.

نصائح أخرى

1) ما هو الغرض من وظيفة __cxa_pure_virtual ()؟

يمكن أن تسمى الوظائف الافتراضية النقية أثناء بناء الكائنات / الدمار. إذا حدث ذلك، فسيتم استدعاء __cxa_pure_virtual () للإبلاغ عن الخطأ. يرى من أين تأتي تعطل "دعوة الوظيفة الافتراضية النقية؟

2) لماذا قد تحتاج إلى تحديد ذلك بنفسك؟

عادة ما يتم توفير هذه الوظيفة بواسطة libstdc ++ (على سبيل المثال على Linux)، ولكن AVR-GCC و Toolchain Arduino لا توفر LibstDC ++.

يدير Arduino IDE من تجنب خطأ الرابط عند بناء بعض البرامج لأنه يتجمع مع خيارات "الأقسام - الأقسام -fdata-أقسام" وروابط مع "-wl، - GC-Passions"، والذي يسقط بعض المراجع إلى الرموز غير المستخدمة وبعد

3) لماذا هو مقبول لرمز __cxa_pure_virtual () كحلقة لانهائية؟

حسنا، هذا آمن على الأقل؛ يفعل شيئا يمكن التنبؤ به. سيكون من المفيد إحباط البرنامج والإبلاغ عن الخطأ. ستكون حلقة لا حصر لها محرجة لتصحيح الأخطاء، إلا إذا كان لديك مصحح يمكن أن يقاطع التنفيذ وإعطاء مكدس التركة.

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