سؤال

لدي فئة مثل

class K {
  static int a;
  static int b;
}

أرغب في إنشاء مكتبة مشتركة (dll) تحتوي على هذه الفئة K.في ملف CPP تم تجميعه في المكتبة التي أسميها

int K::a = 0;
int K::b = 0;

لإنشاء مثيل للمتغيرات الثابتة.يتم تجميع ملف dll بدون أخطاء، ولكن عندما أستخدم المكتبة، يظهر لي خطأ الرمز الخارجي الذي لم يتم حله للأعضاء K::a و K::b.في البرنامج الرئيسي حيث أريد استخدامه، أقوم بتضمين نفس الرأس مع إعلان الفصل K, ، والفرق الوحيد هو أنه بالنسبة للمكتبة التي أستخدمها class __declspec( dllexport ) K { ... } وبالنسبة للبرنامج الرئيسي class K { ... }

من المحتمل أنني ارتكبت أكثر من خطأ، لذا ستكون أسئلتي كيف يمكنني ذلك

  • هل تطلب من الرابط مشاركة فئة العضو الثابتة في المكتبة؟
  • استخدام أعضاء الفئة الثابتة التي تم إنشاؤها في المكتبة في البرنامج الرئيسي؟

ملاحظة.أستخدم فيجوال ستوديو 2008..

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

المحلول

ينبغي للمرء أن يستخدم __declspec( dllimport ) في الرأس في التطبيق الرئيسي.

اذا هنا الحل.ملف الرأس (المضمن في كل من المكتبة والتطبيق الرئيسي) هو:

#ifdef COMPILE_DLL
#define DLL_SPEC __declspec( dllexport )
#else
#define DLL_SPEC __declspec( dllimport )
#endif

class DLL_SPEC K {
   static int a;
   static int b;
}

يحتوي ملف cpp الموجود في المكتبة على:

int K::a = 0;
int K::b = 0;

لتجميع المكتبة، يتعين على المرء تحديد الماكرو COMPILE_DLL، بالنسبة للتطبيق الرئيسي، لا ينبغي تعريفه.

نصائح أخرى

ربط المكتبة بشكل ثابت بدلا من ديناميكيا.

أو أضف دالة عامة في ملف DLL تقوم بإرجاع القيم.

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