سؤال

لنفترض أن لدي ثلاثة ج تقول المكتبات الثابتة libColor.a والذي يعتمد على *libRGB.*a والذي بدوره يعتمد عليه libPixel.a .المكتبة libColor.a ويقال أن تعتمد على المكتبة libRGB.a نظرًا لوجود بعض المراجع فيه libColor.a لبعض الرموز المحددة في libRGB.a.كيف يمكنني دمج جميع المكتبات المذكورة أعلاه في مكتبة جديدة libNewColor.a وهي مستقلة؟

"مستقل" يعني أن المكتبة الجديدة يجب أن تحتوي على جميع الرموز المحددة.لذلك أثناء الارتباط أحتاج فقط إلى العطاء -لون جديد.يجب أن يكون حجم المكتبة الجديدة في حده الأدنى، أي ألا تحتوي على أي رموز libRGB.a الذي لا يستخدم من قبل libColor.a إلخ.لقد جربت حظي باستخدام الخيارات المختلفة في ع الأمر (يستخدم لإنشاء وتحديث المكتبات/المحفوظات الثابتة).

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

المحلول

1/ استخراج جميع ملفات الكائنات من كل مكتبة (باستخدام ar) وحاول تجميع التعليمات البرمجية الخاصة بك بدون المكتبات أو أي من ملفات الكائنات.من المحتمل أن تحصل على حمولة مطلقة من الرموز غير المحددة.إذا لم تحصل على أي رموز غير محددة، فانتقل إلى الخطوة 5.

2/ احصل على الملف الأول واكتشف ملف الكائن الذي يرضي هذا الرمز (باستخدام nm).

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

4/ انتقل إلى الخطوة 2.

5/ قم بدمج جميع ملفات الكائنات الموجودة في قائمتك (إن وجدت) في مكتبة واحدة (مرة أخرى مع ar).

انفجار!هذا هو الحال.حاول ربط الكود الخاص بك بدون أي من الكائنات ولكن مع المكتبة الجديدة.

يمكن أتمتة هذا الأمر برمته بسهولة نسبية باستخدام برنامج نصي Shell.

نصائح أخرى

إحدى الميزات المستخدمة قليلًا في أرشيفي GNU هي نص الأرشيف، وهو عبارة عن واجهة بسيطة ولكنها قوية، ويمكنه أن يفعل ما تريده بالضبط، على سبيل المثال إذا كان النص التالي يسمى script.ar:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

ثم يمكنك استدعاء ar كما يلي:

ar -M < script.ar

وستحصل على libNewColor.a الذي يحتوي على كافة ملفات .o من libColor.a libRGB.a وlibPixel.a.

بالإضافة إلى ذلك، يمكنك أيضًا إضافة ملفات .o عادية أيضًا باستخدام أمر ADDMOD:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

علاوة على ذلك، من السهل جدًا إنشاء هذه البرامج النصية في Makefiles، لذلك عادةً ما أقوم بإنشاء قاعدة makefile عامة إلى حد ما لإنشاء الأرشيفات التي تنشئ بالفعل البرنامج النصي وتستدعي ar على البرنامج النصي.شيء من هذا القبيل:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

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

فيما يلي المستندات الخاصة بهذه الميزة:

https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts

المكتبة الثابتة ليست أكثر من مجرد أرشيف لبعض ملفات الكائنات (.o).ما يمكنك فعله هو استخراج كافة الكائنات الموجودة في المكتبتين (باستخدام "ar x") ثم استخدام "ar" لربطها معًا في مكتبة جديدة.

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