كيف يمكنني عزل رموز مكتبات C/C ++/OBJC من بعضها البعض؟
-
01-10-2019 - |
سؤال
لديّ مشروع يحتاج إلى دمج مكتبتين من الطرف الثالث ، LIBA و LIBB. لدي القليل ، إن وجد ، على مكتبات الطرف الثالث. المشكلة هي أن كل من LIBA و LIBB يتضمنان إصدارات مختلفة من مكتبة مشتركة ، ASIHTPREQUEST. نتيجة لذلك ، أحصل على أخطاء مثل:
-[ASIFormDataRequest setNumberOfTimesToRetryOnTimeout:]: unrecognized selector sent to instance 0x3b4170
, ، وهو ما لا يمكنني افتراضه هو أن LIBA يشير إلى تنفيذ LIBB لـ ASIHTPREQUEST (أو العكس).
لقد حاولت اللعب مع strip -s <symbol file> -u <library>
لعزل رموز المكتبات عن بعضها البعض ، ولكن هذا ينتج عنه ارتباط Xcode الذي يبصق الآلاف من التحذيرات ولا يحدد في الواقع المشكلة الرئيسية الموضحة أعلاه.
ld: warning: can't add line info to anonymous symbol anon-func-0x0 from ...
بشكل عام ، كيف يمكن/يجب أن يعزل المكتبات عن بعضها البعض؟
المحلول
لا توجد طريقة على الإطلاق للقيام بذلك. يمكن أن يكون لتطبيق Objective-C معنى واحد فقط لرمز واحد في وقت واحد. إذا قمت بتحميل نسختين مختلفتين من مكتبة واحدة ، فسيقوم آخر بتكوين أول واحد.
اثنين من الحلول:
- إقناع المطور باستخدام نسخة حديثة
- قم بتشغيل كلتا المكتبات في عمليات منفصلة
نصائح أخرى
إذا استخدموا نفس اسم رمز الرابط لإجراءات مختلفة ، فإن السبيل الوحيد للخروج (أقل من اختراق ملفات الكائنات الخاصة بهم) هو ربطها إلى مختلف التنفيذيين بطريقة أو بأخرى.
على المنصات التي تدعم الارتباط الديناميكي (على سبيل المثال: DLLS) ، يمكنك إنشاء واحدة أو كليهما في DLL منفصلة. إذا لم تكن جزءًا من الواجهة المصدرة ، فلا ينبغي أن تصطدم الرموز بعد ذلك.
وإلا فإنك ستكون عالقًا في وضعها في عمليات منفصلة تمامًا واستخدام IPC لتمرير البيانات بينها.