سؤال

لديّ مشروع يحتاج إلى دمج مكتبتين من الطرف الثالث ، 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 معنى واحد فقط لرمز واحد في وقت واحد. إذا قمت بتحميل نسختين مختلفتين من مكتبة واحدة ، فسيقوم آخر بتكوين أول واحد.

اثنين من الحلول:

  1. إقناع المطور باستخدام نسخة حديثة
  2. قم بتشغيل كلتا المكتبات في عمليات منفصلة

نصائح أخرى

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

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

وإلا فإنك ستكون عالقًا في وضعها في عمليات منفصلة تمامًا واستخدام IPC لتمرير البيانات بينها.

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