2010-09-29 12 views
63

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

मैं, किसी मर्ज किए गए स्थिर पुस्तकालय बनाने के अनुप्रयोगों

+6

भी देखें: [ 'libtool' आधारित समाधान] (http: // stackoverflow। कॉम/ए/8170851/1 9 6561): 'libtool -static -o new.a old1.a old2.a' – osgx

+1

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

उत्तर

39

आप दोनों .a फाइलों से वस्तु निकालने और निकाले .o रों का उपयोग कर अपने .a फ़ाइल बना सकते हैं की अंतिम कड़ी के लिए दोनों पुस्तकालयों नहीं देने के लिए करना चाहते हैं:

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

खतरे, विल रॉबिन्सन! Lib_c.a और libxyz.a में सदस्यों के नाम ओवरलैप नहीं होने पर यह _only_ काम करता है। अन्यथा आप एक को ओवरराइट करेंगे और यह खो जाएगा। –

+5

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

+6

'ar -c' मेरे लिए काम नहीं किया (उबंटू 14.04)। मुझे 'ar मिला: कोई ऑपरेशन निर्दिष्ट नहीं है '। मैंने इसके बजाय 'ar -qc' किया और यह अच्छी तरह से काम किया। – Max

6

आप बस के रूप में यह करते हैं:

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

आप अगर टी कुछ वस्तु फ़ाइलों खो जाएगा यहां दोनों आ और बा तो में एक ही नाम के साथ सदस्य हैं, तो आप विभिन्न फ़ोल्डर में विभिन्न अभिलेखागार के सदस्यों को निकालने के लिए की जरूरत है:

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 

आगे और अधिक, यह posible है वहाँ एक संग्रह में एक ही नाम के कई सदस्यों हैं कि (aa में कहें), यदि आप ar x aa चलाते हैं, तो आपको उसी नाम के उन सदस्यों के लिए केवल एक ही मिल जाएगा।

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' के साथ संकलित किया जाना चाहिए। – osgx

72

मूल रूप से करने के कम से कम तीन तरीके हैं। पहला और सबसे पोर्टेबल तरीका libtool का उपयोग करना है।

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

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

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 

सभी उपरोक्त विधियां मूल अभिलेखागार से ओवरलैपिंग सदस्य नामों को गहन रूप से संभालती हैं।

अन्यथा, आप अलग अलग निर्देशिका में खोल और फिर repack, ओवरलैपिंग सदस्य के नाम की जगह से बचने के लिए करना होगा:

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

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

+0

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

+0

+1! – scraimer