استدعاء المؤشر الثابت إلى قائمة من مكتبة مشتركة في C ++

StackOverflow https://stackoverflow.com/questions/1851053

سؤال

لدي عضو فئة ثابتة

class bar {...}

class foo {
    public:
        static QHash<qint64,bar>* barRepHash;
}

الآن أسميه دالة تصل إلى هذا العضو ضمن مكتبة مشتركة، أحصل على خطأ في الذاكرة بينما عند الوصول إلى الوظيفة من خلال البرنامج الرئيسي، فإنه يعمل بشكل جيد. لقد اختبرت هذا تحت عدد من الظروف.

قمت بتهيئة المتغير في التطبيق الرئيسي، لكنني لا أقوم بتدوينها مرة أخرى في المكتبة المشتركة (بدا أنها غير ضرورية).

أنا أستخدم دول مجلس التعاون الخليجي و كيو تي في أوبونتو.

ماذا تسير وكيف يمكنني إصلاحه؟

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

المحلول

سيحصل IIRC على EXE والمكتبة المشتركة على نسخها الخاصة من متغيرات الأعضاء الثابتة من هذا القبيل، وذلك كما ستحتاج إلى تهيئةها بشكل منفصل في كل حالة.

منذ مؤشرها، قد يتم تهيئة طريقة واحدة في برنامجك الرئيسي كالمعتاد، ثم قم بتمرير المؤشر إلى DLL عند تحميله بحيث يمكن ضبط إصدار DLL للإشارة إلى نفس المكان الذي يتمتع به EXE.

عدل جاء المتغير من مصدر مشترك، مثل القول مكتبة ثابتة).

سأختبر لمعرفة ما إذا كان dllimport / Export على الفصل يجعلها تستخدم نسخة مشتركة.

Edit2:

انقر فوق موافق باستخدام __declspec (dllexport) في DLL و __declspec (dllimport) في EXE (استخدم وحدات ماكرو Preprocessor للتبديل بينها اعتمادا على ما يتضمن الرأس)، لجعل الإعلان المتغير الثابت جعل المتغير الثابت مشتركا في كلا الوحدات. كما يعمل أيضا من أجل المتغيرات العالمية، وسأفترض متغيرات الوظائف الثابتة.

#pragma once

//defined when compiling test.dll
#ifdef TEST_EXPORTS
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

//foo and bar definition in test.cpp, ie only in the dll's compile
class X
{
public:
    static int foo;
};
DLL extern int bar;

ومع ذلك، لا يحتوي AFAIK GCC على DLEXPORT و DLLIMPORPORT، ومع ذلك فقد يكون لها طريقة أخرى لتحقيق نفس الآثار عند إنشاء Libaries المشترك (سواء كانت DLL أو نحو ذلك).

إذا لم يكن كذلك، فإن الحل الآخر الوحيد الذي يمكنني التفكير فيه هو ما اقترحته لأول مرة. تهيئة مؤشر ثابت الخاص بك في EXE، ثم لديك وظيفة في DLL لتعيين الفوارج الثابتة، والتي يمكن أن يستدعي EXE تمرير نسخته من المؤشر.

نصائح أخرى

باستخدام سمات "القسم" يمكن وضعها على أقسام محددة بصرف النظر عن البيانات و BSS. فقط في Windows، يمكن مشاركة هذه الأقسام عبر التنفيذ باستخدام السمة "المشتركة". في منصات أخرى، هذه الميزة غير مدعومة. لذلك سيكون الحل المذكور في الإجابة السابقة.

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