स्थैतिक पुस्तकालयों को एक में दो "ए.आर." कैसे मिलाएं?


90

मेरे पास 2 स्थिर लिनक्स पुस्तकालय हैं, जिनके द्वारा बनाया गया है ar cr, libabc.aऔर libxyz.a
मैं उन्हें एक स्टैटिक लाइब्रेरी में मर्ज करना चाहता हूं libaz.a
मैं यह कैसे कर सकता हूँ।

मैं एक विलयित स्थिर पुस्तकालय बनाना चाहता हूं, न कि दोनों पुस्तकालयों को आवेदनों की अंतिम कड़ी देने के लिए।


7
इसे भी देखें: libtoollibtool -static -o new.a old1.a old2.a
-बड़े हुए

2
यह सही काम करता है, बस थोड़ा संदेह है अगर उन पुस्तकालयों में आम फ़ाइल है। लेकिन (कार्यक्षमता बुद्धिमान वे अलग हैं) क्या यह अभी भी काम करेगा?
बाइंडोफिसाक

libtool -static -o new.a old1.a old2.a linux (
सेंटो

जवाबों:


59

आप दोनों .aफ़ाइलों से ऑब्जेक्ट को निकाल सकते हैं और .aनिकाले गए .os का उपयोग करके अपनी फ़ाइल बना सकते हैं :

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

63
खतरे, रॉबिन्सन! यह केवल तभी काम करता है जब सदस्यों के नाम libabc.a और libxyz.a में ओवरलैप न हों। अन्यथा आप एक को अधिलेखित कर देंगे और यह खो जाएगा।
डेविड

6
इसके अलावा, libabc.aएक ही नाम (अलग-अलग निर्देशिकाओं के रूप में उत्पन्न) वाले ऑब्जेक्ट हो सकते हैं - फिर से असेंबल करना काम नहीं करेगा!
इगोर आर।

15
ar -cमेरे लिए काम नहीं किया (Ubuntu 14.04)। मुझे मिल गया ar: no operation specified। मैंने इसके ar -qcबजाय किया और अच्छा काम किया।
अधिकतम

ar t lib.a का उपयोग वास्तव में फ़ाइलों को निकाले बिना लाइब्रेरी में फ़ाइलों को देखने के लिए किया जा सकता है।
राज_गट्ट

मैं इसे कैसे कर सकता हूँ?
शुवा

119

इसे मूल रूप से करने के कम से कम तीन तरीके हैं । पहला और सबसे पोर्टेबल तरीका है libtool का उपयोग करना। अन्य पुस्तकालयों को भी libtool के साथ बनाए जाने के बाद, आप उन्हें केवल एक स्वचालित libaz_la_LIBADD चर में .la libs जोड़कर या सीधे मेकफाइल से कुछ के साथ जोड़ सकते हैं:

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

GNU का उपयोग करते समय अन्य दो कम से कम उपलब्ध हैं। आप एक MRI स्क्रिप्ट का उपयोग कर सकते हैं (उदाहरण के लिए libaz.mri नाम), जैसे:

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

और फिर इस तरह से निष्पादित करें:

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

19
उन लोगों के लिए जो सामान्य संग्रह (पतले नहीं) चाहते हैं, एक साधारण चीज जो की जा सकती है, वह एक पतली संग्रह है, फिर इसे एक सामान्य संग्रह में परिवर्तित करें। की तरह कुछ: ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M। यह एक अस्थायी पतली बनाता है libaz.a, और फिर पतले संग्रह को एक सामान्य में परिवर्तित करता है (ताकि आप इसे स्थानांतरित / वितरित कर सकें)। जब आपके पुस्तकालय के नाम विशेष वर्ण (स्थान, जोड़, या अल्पविराम) (यानी ar cqT libbundle.a libfoo++.a 'libbar baz.a') होते हैं, तो यह इनायत से संभालता है । लेकिन +1 मुझसे!
कॉर्नस्टाल्स

पहले एमआरआई स्क्रिप्ट उदाहरण के लिए नकारात्मक पक्ष क्या है?
jb

अच्छा जवाब! कुछ विकल्पों को देखने के लिए अच्छा है जिन्हें आपको निकालने और पुनः प्राप्त करने की आवश्यकता नहीं है। इसके अलावा मुझे लगता है कि @ कॉर्नस्टालक्स का विचार अच्छा है। शायद जवाब में जोड़ा जाना चाहिए?
लाइटबल्ब

अरे जब मैं libtoolइन इरोस को पाने के लिए कमांड का उपयोग करने की कोशिश करता हूं: libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag' किसी भी विचार को कैसे ठीक करना है?
लार्स नीलसन

@Guillem @ कॉर्नस्टालक्स शानदार जवाब। क्या होगा यदि --Wl,-whole-archiveविकल्प कई लिबास * .a के लिए मूल लिंकिंग कमांड में आवश्यक है, और मुझे सभी लिबर * .a में संयोजन करने की आवश्यकता है one.a। जब फिर से लिंक करना, --Wl,-whole-archiveसाथ काम नहीं करेगा one.a। आपका क्या सुझाव है? stackoverflow.com/questions/56323197/…
थिंकपाइप

10

यदि आप इसे बस करते हैं:

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

यदि आप आ और 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

इससे भी अधिक, यह पॉसिबल है कि एक संग्रह में एक ही नाम के कई सदस्य हैं (आ में कहते हैं), यदि आप x एए चलाते हैं, तो आपको उसी नाम के उन सदस्यों के लिए केवल एक ही मिलेगा।

एक संग्रह में एक ही नाम के सभी सदस्यों को निकालने का एकमात्र तरीका सदस्य संख्या 'विकल्प' द्वारा निर्दिष्ट करना है:

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 

इस तरह लिंकर आपके लिए सभी चीजों को संभाल लेगा!


1
शमूएल, धन्यवाद। लेकिन साझा पुस्तकालय में संयोजन के साथ, सभी ऑब्जेक्ट को संकलित किया जाना चाहिए -fPIC
ऑस्कैक्स

0

इससे भी बेहतर है कि आप प्रत्येक लाइब्रेरी पर आंशिक लिंकिंग करते हैं और वे दो परिणामी ऑब्जेक्ट फ़ाइलों का एक संग्रह बनाते हैं। इस तरह यह साझा पुस्तकालयों की तरह संचालित होता है

आप आंशिक लिंकिंग के साथ करते हैं

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

यह वास्तव में पूछे गए सवाल का जवाब नहीं दे रहा है - जैसा कि उन्होंने पुस्तकालयों के लिए पूछा। कई बार आपके पास दिए गए पुस्तकालयों के स्रोत भी नहीं होते हैं, या उन्हें अन्य कारणों से पूर्वनिर्मित रखना चाहते हैं।
फोलट

0
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" के दो संस्करण हैं


0
ar crsT libaz.a libabc.a libxyz.a

यहां, आप अभिलेखों का संग्रह बनाते हैं और फिर टी फ्लैग के साथ 'समतल' (पतला) परिणाम देते हैं। निश्चित नहीं है कि यह उसी नाम वाली .o फ़ाइलों के साथ कैसे काम करेगा जो भीतर निहित हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.