إجبار إدراج ملفات كائنات مكتبة ثابتة لا تصدر أي رموز (GCC / iPhone)
-
12-09-2019 - |
سؤال
أقوم بإنشاء مكتبة ثابتة للاستخدام في تطبيقات iPhone. يحتوي على عدد من الملفات المصدر التي لا تصدر أي رموز، كل ما يفعلونه هو إنشاء مثيل ثابت من الفصل الذي يقوم بعد ذلك بتشغيل بعض الكود في منشئه الذي يسجل أشياء مختلفة مع فئة مدير مركزية في مكان آخر. كل هذا يعمل بشكل جيد عندما يتم بناء التعليمات البرمجية كجزء من تطبيق iPhone القياسي، ولكن عندما يتم فصله إلى مكتبة ثابتة، فلا تصدر هذه الملفات في التطبيق النهائي الثنائي، وبالتالي فإن منشئين مثيلات الطبقة الخاصة التي تحتويون عليها دون 'T الحصول على تشغيل، وهذا يسبب مشاكل. لقد قمت بإيقاف تشغيل كل خيار بناء مع تجريد ميت وما إلى ذلك لكلا مكتبة ثابتة وبناء التطبيق النهائي.
ركضت في هذه المشكلة على مترجم Metrowerks منذ فترة، ولكن في هذه الحالة كانت تحدث حتى عندما تم تصميم التعليمات البرمجية في تطبيق واحد دون أي مكتبات متوسطة. كان الحل واضحا جدا: استخدم فقط __declspec(force_export)
على حالات الطبقة الخاصة وكل شيء على ما يرام.
هل هناك أي ما يعادل دول مجلس التعاون الخليجي / اي فون؟ أنا أستخدم XCode 3.1.4 مع GCC 4.2 واستهداف iPhone OS 3.1. بدلا من ذلك، هناك طريقة لإخبار التطبيق بالارتباط في كل ملف كائن في المكتبة الثابتة بغض النظر عما إذا كان الأمر كذلك بالدراسة أم لا؟ لقد أكدت استخدام ar
أن المجموعة الكاملة من ملفات الكائنات تجعلها في المكتبة الثابتة.
شكرا مقدما.
المحلول
أعتقد أن الخيار الذي تبحث عنه هو -all_load
:
-all_load
Loads all members of static archive libraries. See man ld(1) for
more information.
نصائح أخرى
-all_load
لديه بعض المشكلات إذا حدثت ربط العديد من المكتبات و / أو الأطر (Mac OS X). في هذه الحالة، يجب عليك فقط إجبار جميع الرموز من مكتبة محددة باستخدام -force_load
:
g++ test.cpp -o test -force_load libtoload.a