C ++ DLL-linking externals لم يتم حلها
سؤال
لدي كبير إلى حد ما Core
المشروع الذي أعمل معه ، أحاول تكييفه لاستخدام محرك DLL الذي قمت بإنشائه ، أحصل على مجموعة من الأخطاء مثل:
رمز خارجي لم يتم حله "خاص: فئة ثابتة
عند تضمين بعض الرؤوس من النواة في DLL ، يتم تصدير الفصل عبر __declspec (Dllexport) ولكن أي رأس مع أعضاء ثابتين يلقي حموضة من الأخطاء المتعلقة بالأعضاء الثابتة.
هذا مشروع كبير إلى حد ما ، لا يمكنني الركض بالضبط على إزالة كل عضو في الفصل الثابت الذي أراه ، هل هناك على أي حال حول هذا النوع من الأشياء؟
مثال أساسي لفصل يتم استيراده:
class __declspec(dllexport) MyClass
{
public:
static bool m_someVar;
}
من أجل الوضوح ، أود فقط معالجة أن m_somevar محددة/إعلان (انسى المصطلح) في ملف تنفيذ الفئات
المحلول
عند تجميع Core
تريد أن تكون هذه الوظائف dllexport
; ؛ ومع ذلك ، عند تجميع DLL ، تريد أن يكونوا dllimport
. في حالتك ، أنت تحددها دائمًا dllexport
, ، وبالتالي عندما تربط DLL ، فإنك تشكو من أنك أعلنت وظيفة (وقلت أنك ستقوم بتصديرها) دون تحديدها.
الحل بسيط. بدلا من يدوي __declspec
جي ، قم بإنشاء ماكرو بناءً على ما إذا كنت Core
أو DLL:
#ifndef I_AM_A_DLL
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#else
#define EXPORT __declspec(dllimport)
#define IMPORT __declspec(dllexport)
#endif
يستخدم EXPORT
للوظائف في Core
و IMPORT
للوظائف في DLLs الخارجية:
class EXPORT MyClass
{
public:
static bool m_someVar;
}
نصائح أخرى
باستخدام المقتطف الخاص بك وتشغيل DUMPBIN.EXE /تصدير على DLL ينتج هذا المخرج:
1 0 0001107D ??4MyClass@@QAEAAV0@ABV0@@Z = @ILT+120(??4MyClass@@QAEAAV0@ABV0@@Z)
2 1 00017000 ?m_someVar@MyClass@@2_NA = ?m_someVar@MyClass@@2_NA (public: static bool MyClass::m_someVar)
لاحظ كيف يوجد تصدير للعضو الثابت ولكن لديه اسم مختلف بمهارة عنك. إذا قمت بتشغيل اسم التصدير الخاص بك من خلال undname.exe ، أحصل على:
Undecoration of :- "?m_someVare@MyClass@@0EA"
is :- "private: static unsigned char MyClass::m_someVare"
لاحظ الفرق. لديك ماكرو شرير في مشروعك المستهدف. إصلاح مشكلتك عن طريق إضافة هذا إلى ملف الرأس:
#undef bool
قد يكون لهذا بعض الآثار الجانبية :)
ربما سؤال سخيف ولكن هل تحدده في مكان ما؟ سيبدو تعريفك شيئًا مثل:
bool MyClass::m_someVar = false;