سؤال

لدي كبير إلى حد ما 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top