أعضاء الفصل الثابت في المكتبة المشتركة
-
06-07-2019 - |
سؤال
لدي فئة مثل
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 تقوم بإرجاع القيم.