سؤال

لدي تطبيق يستخدم مكتبة ثابتة قمت بها. يحتوي ملف .cpp في المكتبة بإعلان متغير ثابت، الذي يستدعي طيرانه وظيفة على Singleton يقوم بشيء ما - على سبيل المثال، يضيف سلسلة.

الآن عندما أستخدم هذه المكتبة من التطبيق، يبدو أن Singleton لا يحتوي على أي آثار للسلسلة التي كان من المفترض أن تضاف.

أنا بالتأكيد فقدت شيئا ولكني لا أعرف ماذا ..

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

المحلول

إذا كان لديك كائن في مكتبة ثابتة لا صراحة المستخدمة في التطبيق. ثم الرابط لن يسحب هذا الكائن من lib إلى التطبيق.

هناك فرق كبير بين المكتبات الثابتة والديناميكية.

المكتبة الديناميكية:
في وقت الترجمة، يتم سحب شيء من المكتبة الديناميكية. تتم إضافة رمز إضافي لتحميل صريح وحل الرموز في وقت التشغيل. في وقت التشغيل، يتم تحميل المكتبة بأكملها، وبالتالي يتم استدعاء مهاجية الكائنات (على الرغم من متى يتم تفاصيل التنفيذ).

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

نصائح أخرى

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

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

Refactor الفصول التي تقوم بالتهيئة الثابتة حتى لا تعتمد على أي فصول أخرى. وهذا هو، وجعل تهيئة كل فئة مستقلة واكتفاء الذات.

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