2009-03-17 15 views
43

इन दो फ़ाइल प्रकारों के बीच क्या अंतर है। मैं देखता हूं कि मेरे सी ++ ऐप निष्पादन योग्य के निर्माण के दौरान दोनों प्रकार के खिलाफ लिंक करता है।.o फ़ाइलें बनाम .a फ़ाइलें

.a फ़ाइलों को कैसे बनाया जाए? लिंक, संदर्भ, और विशेष रूप से उदाहरण, अत्यधिक सराहना की जाती है।

उत्तर

46

.o फ़ाइलें ऑब्जेक्ट्स हैं। वे कंपाइलर और लिंकर/लाइब्रेरियन में इनपुट का आउटपुट हैं।

.a फ़ाइलें संग्रह हैं। वे वस्तुओं या स्थैतिक पुस्तकालयों के समूह हैं और लिंकर में भी इनपुट कर रहे हैं।

अतिरिक्त सामग्री

मैं आपके प्रश्न के "उदाहरण" भाग नोटिस नहीं किया था। आम तौर पर आप स्थिर पुस्तकालय उत्पन्न करने के लिए एक मेकफ़ाइल का उपयोग करेंगे।

AR = ar 
CC = gcc 

objects := hello.o world.o 

libby.a: $(objects) 
    $(AR) rcu [email protected] $(objects) 

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

यह hello.c और world.c वस्तुओं में संकलन और फिर उन्हें पुस्तकालय में संगृहीत कर लिया जाएगा। प्लेटफ़ॉर्म के आधार पर, आपको संग्रह पर सामग्री की तालिका जेनरेट करने के लिए ranlib नामक उपयोगिता चलाने की भी आवश्यकता हो सकती है।

एक दिलचस्प पक्ष नोट: .a फ़ाइलें तकनीकी रूप से संग्रह फ़ाइलें और लाइब्रेरी नहीं हैं। वे संपीड़न के बिना ज़िप फ़ाइलों के समान हैं हालांकि वे एक बहुत पुराने फ़ाइल प्रारूप का उपयोग करते हैं। उपयोगिताओं द्वारा उत्पन्न सामग्री की तालिका ranlib है जो एक संग्रह को लाइब्रेरी संग्रह बनाता है। जावा संग्रह फ़ाइलें (.jar) समान हैं कि वे ज़िप फ़ाइलें हैं जिनमें जावा संग्रहकर्ता द्वारा बनाई गई कुछ विशेष निर्देशिका संरचनाएं हैं।

+1

यह मेक के विषय पर है, लेकिन अभी मैं जोड़ना होगा सोचा, आप भी स्थानापन्न कर सकते हैं '$ (वस्तुओं)' नुस्खा लाइन पर ('$ इस पेज में खोज (एआर) आरसीयू $ @ $ (ऑब्जेक्ट्स) ')' libby.a' लक्ष्य के साथ क्रमशः पहले या सभी आवश्यक लक्ष्यों को संदर्भित करने के लिए '$ <'या' $^'के साथ लक्ष्य।इसका वही प्रभाव होगा, लेकिन '$ (ऑब्जेक्ट्स) को दो बार निर्दिष्ट करने की अनावश्यकता को हटा देता है, यदि परिवर्तनीय नाम या पूर्वापेक्षाएँ बदलती हैं, और कम कोड होने पर भी दो स्थानों में संदर्भ को अपडेट करने की आवश्यकता होती है। –

+1

@ शममेलली - मैं आम तौर पर '$ ^' से बचता हूं क्योंकि यह एक जीएनयू विस्तार है और [बीएसडी मेक] में मौजूद नहीं है (https://www.freebsd.org/cgi/man.cgi?make (1)) या [POSIX मेक] में (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html)। मुझे इससे कोई फर्क नहीं पड़ता क्योंकि अधिकांश लिनक्स डिस्ट्रोज़ जीएनयू आधारित हैं लेकिन बैश से डैश तक '/ bin/sh' का स्विच मुझे जीएनयू विशिष्ट एक्सटेंशन से बचने के लिए पर्याप्त था। –

+0

जानना अच्छा है। धन्यवाद। –

1

मुझे विश्वास है कि एक। ए फ़ाइल एक संग्रह है जिसमें एकाधिक ऑब्जेक्ट फ़ाइलें हो सकती हैं।

14

ए .o फ़ाइल एक एकल संकलन इकाई (अनिवार्य रूप से एक स्रोत-कोड फ़ाइल, संबंधित शीर्षलेख फ़ाइलों के साथ) को संकलित करने का परिणाम है जबकि एक .a फ़ाइल एक या अधिक है .o फ़ाइलें लाइब्रेरी के रूप में पैक की गई हैं।

5

आप ar का उपयोग .o फ़ाइलें (वस्तु फ़ाइलें)

देखें man ar जानकारी के लिए से .a फ़ाइल (स्थिर पुस्तकालय) बनाने के लिए कर सकते हैं।

11

डी शॉली का जवाब अच्छा है, मैं बस कुछ अंक जोड़ना चाहता था क्योंकि अन्य उत्तरों क्या हो रहा है की अपूर्ण समझ को दर्शाते हैं।

ध्यान रखें कि संग्रह फ़ाइलें (.a) ऑब्जेक्ट फ़ाइलों (.o) को प्रतिबंधित करने के लिए प्रतिबंधित नहीं हैं। उनमें मनमानी फाइलें हो सकती हैं। अक्सर उपयोगी नहीं है, लेकिन एक बेवकूफ लिंकर चाल के लिए dynamic linker dependenciy info embedded in an archive देखें।

यह भी ध्यान दें कि ऑब्जेक्ट फ़ाइलें (.o) आवश्यक रूप से एकल संकलन इकाई का परिणाम नहीं हैं। कई छोटी ऑब्जेक्ट फ़ाइलों को आंशिक रूप से एक बड़ी फ़ाइल में लिंक करना संभव है।

http://www.mihaiu.name/2002/library_development_linux/ - के लिए "आंशिक"

संबंधित मुद्दे