سؤال

لدي مكتبتان ثابتتان لنظام Linux تم إنشاؤهما بواسطة ar cr, libabc.a و libxyz.a.
أريد دمجها في مكتبة ثابتة واحدة libaz.a.
كيف يمكنني أن أفعل هذا.

أرغب في إنشاء مكتبة ثابتة مدمجة، وعدم منح كلتا المكتبتين الرابط النهائي للتطبيقات.

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

المحلول

يمكنك استخراج الكائن من كل من .a الملفات وإنشاء الخاص بك .a ملف باستخدام الاستخراج .oس:

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

نصائح أخرى

هناك ثلاث طرق على الأقل للقيام بذلك نا. الطريقة الأولى والأكثر حماقة هي استخدام libtool. بعد بناء المكتبات الأخرى أيضًا مع libtool ، يمكنك الجمع بينها فقط عن طريق إضافة libs .la إلى متغير libaz_la_labadd ، أو مباشرة من makefile مع شيء مثل:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

الاثنان الآخران متاحان على الأقل عند استخدام GNU AR. يمكنك استخدام برنامج نصي التصوير بالرنين المغناطيسي (المسمى على سبيل المثال libaz.mri) ، مثل:

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

ثم تنفيذ AR على النحو التالي:

ar -M <libaz.mri

أو يمكنك استخدام أ نحيف أرشيف (الخيار -T) ، والتي ستسمح بإضافة أرشيفات أخرى دون أن تتلاعب بها في الداخل ، على الرغم من أن الجانب السلبي هو أنه إذا كنت ترغب في توزيع المكتبة الثابتة ، فسيكون الكائن المنفصل مفقودًا:

ar -rcT libaz.a libabc.a libxyz.a

جميع الطرق المذكورة أعلاه تتعامل بأسماء أعضاء متداخلة من الأرشيف الأصلي.

خلاف ذلك ، يجب عليك إلغاء الالتفاف في دلائل مختلفة وإعادة حزم مرة أخرى ، لتجنب استبدال أسماء الأعضاء المتداخلة:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

إذا كنت تفعل ذلك ببساطة على النحو التالي:

ar x a.a
ar x b.a
ar c c.a  *.o 

سوف تفقد بعض ملفات الكائنات إذا كان هناك أعضاء يحملون نفس الاسم في كل من AA و BA ، فأنت بحاجة إلى استخراج أعضاء من الأرشيفات المختلفة في مجلد مختلف:

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

علاوة على ذلك ، من الممكن أن يكون هناك العديد من أعضاء الاسم نفسه في أرشيف واحد (على سبيل المثال في AA) ، إذا قمت بتشغيل ar x aa, ، سوف تحصل على واحد فقط لهؤلاء الأعضاء من نفس الاسم.

الطريقة الوحيدة لاستخراج جميع أعضاء الاسم نفسه في أرشيف واحد هي تحديد رقم العضو عن طريق الخيار 'n':

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

سيكون هذا عملاً شاقًا ، لذلك سيتعين عليك كتابة نص أكثر تطوراً للقيام بهذه المهمة.

واحد اختياري الحلول هي أنه يمكنك الجمع بين الأرشيفات المتعددة في مكتبة مشتركة واحدة:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

بهذه الطريقة سوف يتعامل الرابط مع كل الأشياء لك!

والأفضل من ذلك هو إجراء ربط جزئي لكل مكتبة وإنشاء أرشيف لملفي الكائنات الناتجين.وبهذه الطريقة تعمل مثل المكتبات المشتركة

يمكنك القيام بالربط الجزئي مع

gcc -r --nostdlib

لذلك بدلاً من صنع الأرشيف المتوسط ​​أو بعد إعادة النظر فيه ، قم بتشغيله

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

ثم

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

الآن لديك إصداران من "Macroblock-10.o"

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