سؤال

لدي مكتبة (أ) أقوم بتطويرها.عندما أقوم بنشره على الجهاز، فإن المقابلة libA.so و libA-X.Y.Z.so يتم وضعها في /usr/lib (X.Y.Z هو رقم الإصدار).

الآن أقوم بتطوير مكتبة B، والتي تستخدم A.عندما أقوم بالربط B، أستخدم العلامة -lA.ثم "ldd libB.so" يعطيني :

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

مشكلتي هي أنه عندما أقوم بإصدار إصدار جديد من A (X.Y.ZZ)، يجب علي أيضًا إصدار إصدار جديد من B.بخلاف ذلك، لن يتمكن أي شخص يقوم بتثبيت الإصدار A الأحدث من تثبيت الإصدار B الذي سيبحث عن الإصدار X.Y.Z غير الموجود.

كيف يمكنني حل هذه المشكلة؟كيف يمكنني إخبار B بالبحث عن libA.so وليس libA-X.Y.Z.so ؟أم أنه من الخطأ القيام بذلك؟حتى غير آمنة؟

تحديث 1 :المكتبة أ (التي ورثتها من شخص آخر) تستخدم الأدوات التلقائية.

تحديث 2 :عندما أقوم بإنشاء المكتبة أ، أستطيع أن أرى: "-Wl,-soname -Wl,libA-0.6.1.so".إذا فهمت بشكل صحيح فهذا يعني أننا نجبر الصوت على أن يكون libA-0.6.1.so.هل هذا صحيح ؟مشكلتي الآن هي أنه ليس لدي أدنى فكرة عن كيفية تعديل هذا السلوك في مشروع يستخدم الأدوات التلقائية.لقد بحثت في Google لفترة من الوقت ولكن لم أجد أي معلومات مفيدة.هل يجب علي تعديلconfig.in أو Makefile.am؟

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

المحلول

عندما تقوم بإنشاء libA.so، قم بتمرير خيار -soname إلى الرابط (إذا كنت ترتبط عبر gcc، فاستخدم -Wl,-soname).بعد ذلك، عندما يتم ربط B، يشير الرابط إلى A من خلال اسمه الصوتي، وليس من خلال اسم الملف الخاص به.في النظام المستهدف، تأكد من أن لديك رابطًا من الاسم إلى الملف الحقيقي.يرى

http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

نصائح أخرى

وهذا يعمل أيضا في ويندوز باسم "الجحيم DLL":)

إذا B يحتاج إلى إصدار محدد من ألف وكنت تصل إلى يبا لا يبا-X.Y.Z عندها فقط استبدال يبا مع الإصدار الأحدث قد تسبب B عدم تحميل أو تعطل.

ولكن بالطبع يمكنك القيام الرمزي من يبا-X.Y.Z ليبا-X1.Y1.Z1. إذا لم يتم تغيير أي واجهات برمجة التطبيقات والتطبيقات الوحيدة من يجب أن تكون آمنة.

وردا على بلدي التحديث الثاني: في Makefile.am من يبا، I تعديل _la_LDFLAGS من -release إلى <م> -avoid الإصدار . وأدى ذلك إلى مكتبة مشتركة من دون رقم الإصدار وI ثم معاد libB التي ترتبط بنجاح ضد هذه المكتبة المشتركة غير معلومة الإصدار.

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