2009-03-20 14 views
13

मान लीजिए मैं तीन सी स्थिर पुस्तकालयों कहना है libColor.a जो पर निर्भर करता है * libRGB। * एक है जो बदले में libPixel.a पर निर्भर करता है। पुस्तकालय libColor.a पुस्तकालय पर निर्भर रहना libRGB.a के बाद से वहाँ libRGB.a में परिभाषित प्रतीकों में से कुछ के लिए libColor.a में कुछ संदर्भ हैं कहा जाता है। मैं सभी उपरोक्त पुस्तकालयों को एक नए libNewColor.a पर कैसे जोड़ूं जो स्वतंत्र है?संयोजन स्थिर पुस्तकालयों

स्वतंत्र अर्थ यह है कि नई पुस्तकालय में सभी प्रतीकों को परिभाषित किया जाना चाहिए। तो मुझे जोड़ने के दौरान मुझे -lNewColor देने की आवश्यकता है। (करने के लिए इस्तेमाल यानी यह libRGB.a जो द्वारा नहीं किया जाता libColor.a आदि मैं अपने भाग्य ar आदेश में विभिन्न विकल्पों उपयोग करने की कोशिश में कोई प्रतीक नहीं चाहिए नए पुस्तकालय का आकार कम होना चाहिए स्थिर पुस्तकालय/अभिलेखागार बनाएं और अपडेट करें)।

+0

आप वैकल्पिक रूप से http देख सकते हैं: // stackoverflow। कॉम/प्रश्न/8170450/गठबंधन-स्थिर-पुस्तकालय/8170851 # 8170851 और libt का उपयोग करें ool – Bruce

+0

ध्यान दें कि न्यूनतमकरण चरण वास्तव में आवश्यक नहीं है। स्थैतिक पुस्तकालयों के साथ, लिंकर केवल उन ऑब्जेक्ट फ़ाइलों को पकड़ लेगा, जिन्हें साझा पुस्तकालयों के विपरीत, जिसमें सब कुछ शामिल है। प्रत्येक दृष्टिकोण के लिए कारण और फायदे हैं; वे सिर्फ अलग हैं। और जब आप स्थिर पुस्तकालयों के साथ काम कर रहे हों तो आपको वास्तव में चिंता करने की आवश्यकता नहीं है। –

उत्तर

11

1/प्रत्येक लाइब्रेरी से सभी ऑब्जेक्ट फ़ाइलों को निकालें (ar का उपयोग करके) और पुस्तकालयों या किसी भी ऑब्जेक्ट फ़ाइलों के बिना अपना कोड संकलित करने का प्रयास करें। आपको शायद अनिश्चित प्रतीकों का एक पूर्ण बाल्टी लोड मिलेगा। यदि आपको कोई अपरिभाषित प्रतीक नहीं मिलता है, तो चरण 5 पर जाएं।

2/पहले को पकड़ें और पता लगाएं कि कौन सी ऑब्जेक्ट फ़ाइल उस प्रतीक को संतुष्ट करती है (nm का उपयोग करके)।

3/उस ऑब्जेक्ट फ़ाइल को लिखें, फिर नई ऑब्जेक्ट फ़ाइल सहित अपने कोड को संकलित करें। अगर वहाँ कोई भी है आप अपरिभाषित प्रतीकों की एक नई सूची मिल जाएगा या, तो कदम 5

4/जाओ कदम जाना 2.

5/अपनी सूची में सभी वस्तु फ़ाइलें कम्बाइन (यदि हो तो) एक पुस्तकालय में (फिर ar के साथ)।

बैंग! ये लो। किसी भी ऑब्जेक्ट के बिना अपने कोड को लिंक करने का प्रयास करें लेकिन नई लाइब्रेरी के साथ।

यह पूरी चीज एक शेल स्क्रिप्ट के साथ अपेक्षाकृत आसानी से स्वचालित हो सकती है।

+2

अनावश्यक रूप से जटिल, आप बस सभी .o फ़ाइलों को एक बड़े एए में निकाल सकते हैं, जैसे कि जब यह अंततः निष्पादन योग्य में जुड़ा होता है, तो लिंकर किसी भी अप्रयुक्त लोगों को – MarkR

+2

@MarkR को त्याग देगा, @AIB * लाइब्रेरी का आकार चाहता था * निष्पादन योग्य आकार का न्यूनतम नहीं होना चाहिए। – paxdiablo

+0

इसे स्वीकार करते हुए, हालांकि मैं एक ऑनलाइनर से प्यार करता हूं जो ऐसा करता है। केवल कुछ प्रतीकों के साथ लिंक करने के लिए ld को कुछ विकल्प गुजरने की तरह ... – AIB

5

एक स्थिर पुस्तकालय कुछ ऑब्जेक्ट फ़ाइलों (.o) के संग्रह से कहीं अधिक नहीं है। आप क्या कर सकते हैं दो पुस्तकालयों में सभी वस्तुओं को निकालें ("ar x" का उपयोग करके) और फिर एक नई लाइब्रेरी में उन्हें एक साथ जोड़ने के लिए "ar" का उपयोग करें।

15

जीएनयू archiver की एक छोटी सी प्रयुक्त सुविधा संग्रह स्क्रिप्ट, यह एक सरल लेकिन शक्तिशाली इंटरफ़ेस है है, और अगर निम्न स्क्रिप्ट script.ar कहा जाता है यह उदाहरण के लिए वास्तव में आप क्या चाहते हैं कर सकते हैं,:

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

तो फिर तुम ar इस प्रकार आह्वान सकता:

ar -M < script.ar 

और आप libNewColor.a कि libColor.a libRGB.a और libPixel.a से ओ फ़ाइलों के सभी शामिल हैं मिलेगा।

इसके अतिरिक्त आप नियमित रूप से भी जोड़ सकते हैं।ओ फ़ाइलों के रूप में अच्छी तरह से साथ ADDMOD आदेश:

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

इसके अलावा यह Makefiles में ये स्क्रिप्ट उत्पन्न करने के लिए सुपर आसान है, इसलिए मैं आम तौर पर अभिलेखागार बनाने जो वास्तव में स्क्रिप्ट उत्पन्न करता है और पर ar invokes के लिए कुछ हद तक एक सामान्य makefile नियम बनाते हैं स्क्रिप्ट। कुछ इस तरह:

$(OUTARC): $(OBJECTS) 
    $(SILENT)echo "CREATE [email protected]" > $(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) 

हालांकि अब है कि मैं इसे देख मुझे लगता है कि यह $ अगर (वस्तुओं) काम नहीं करता रिक्त है (यानी अगर आप सिर्फ अतिरिक्त वस्तु फ़ाइलों को जोड़ने के बिना अभिलेखागार संयोजित करना चाहते हैं), लेकिन मैं लूंगा एक व्यायाम के रूप में छोड़ पाठक कि इस मुद्दे को ठीक करने के लिए यदि आवश्यक हो तो ...: डी

यहां इस सुविधा के लिये दस्तावेज हैं:

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

+0

यह बहुत अच्छा है! सिवाय इसके कि किसी भी पथ/libs जिसमें नाम में + है, स्क्रिप्ट को तोड़ देता है। उदाहरण के लिए openssl में libncurses ++ है। – Gregory

+0

साफ! यह तरीका है, ऑब्जेक्ट फ़ाइलों को अनपॅक करने और पुनः लोड करने से कहीं अधिक आसान है। – Thomas

+0

ध्यान दें कि किसी कारण से-डी संयोजन के साथ काम नहीं करता है। तो यदि आप निर्धारिती परिणाम प्राप्त करना चाहते हैं, तो आपको अभी भी निकालने के बाद-संग्रह मार्ग की आवश्यकता है। –