سؤال

عند إنشاء مشاريع باستخدام لغة C++‎، وجدت أن تصحيح أخطاء الارتباط أمر صعب، خاصة عند التقاط أكواد برمجية لأشخاص آخرين.ما هي الاستراتيجيات التي يستخدمها الأشخاص لتصحيح أخطاء الارتباط وإصلاحها؟

هل كانت مفيدة؟

المحلول

لست متأكدًا من مستوى خبرتك، ولكن إليك الأساسيات.

يوجد أدناه خطأ رابط من VS 2005 - نعم، إنها فوضى كبيرة إذا لم تكن على دراية بها.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

هناك نقطتان يجب التركيز عليهما:

  • "ByteComparator.obj" - ابحث عن ملف ByteComparator.cpp، وهذا هو مصدر مشكلة الرابط
  • "int __cdecl Does_not_exist(void)" - هذا هو الرمز الذي لم يتمكن من العثور عليه، في هذه الحالة الدالة المسماة Does_not_exist()

في هذه المرحلة، تكون أسرع طريقة لحل المشكلة في كثير من الحالات هي البحث في قاعدة التعليمات البرمجية لهذه الوظيفة والعثور على مكان التنفيذ.بمجرد أن تعرف مكان تنفيذ الوظيفة، عليك فقط التأكد من ربط المكانين معًا.

إذا كنت تستخدم VS2005، فستستخدم قائمة النقر بزر الماوس الأيمن "تبعيات المشروع...".إذا كنت تستخدم gcc، فستبحث في ملفات makefiles الخاصة بك عن خطوة الإنشاء القابلة للتنفيذ (يتم استدعاء gcc مع مجموعة من ملفات .o) وإضافة ملف .o المفقود.


في السيناريو الثاني، قد تفتقد تبعية "خارجية"، والتي ليس لديك رمز لها.غالبًا ما يتم تنفيذ مكتبات Win32 في مكتبات ثابتة يتعين عليك الارتباط بها.في هذه الحالة اذهب إلى MSDN أو "مايكروسوفت جوجل" وابحث عن API.في الجزء السفلي من وصف API يتم إعطاء اسم المكتبة.أضف هذا إلى قائمة خصائص مشروعك "خصائص التكوين->رابط->الإدخال->التبعيات الإضافية".على سبيل المثال، الدالة timeGetTime()'s الصفحة على MSDN يخبرك باستخدام Winmm.lib في أسفل الصفحة.

نصائح أخرى

غالبًا ما تكون مكتبات وقت التشغيل C هي السبب الأكبر.التأكد من أن جميع مشاريعك لها نفس الإعدادات (WRT Single vs Multi-threading) وstatic vs dll.

تعد وثائق MSDN مفيدة للإشارة إلى lib الذي يتطلبه استدعاء Win32 API معين إذا كان مفقودًا.

بخلاف ذلك، عادةً ما يتعلق الأمر بتشغيل العلم المطول والخوض في المخرجات بحثًا عن أدلة.

أحد أخطاء الارتباط الشائعة التي واجهتها هو عندما يتم استخدام دالة بشكل مختلف عن كيفية تعريفها.إذا رأيت مثل هذا الخطأ، فيجب عليك التأكد من أن كل وظيفة تستخدمها تم الإعلان عنها بشكل صحيح في بعض ملفات .h.
يجب عليك أيضًا التأكد من تجميع جميع الملفات المصدر ذات الصلة في نفس ملف lib.أحد الأخطاء التي واجهتها هو عندما يكون لدي مجموعتان من الملفات المجمعة في مكتبتين منفصلتين، وأجري اتصالاً بين المكتبات.

هل هناك فشل في ذهنك؟

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