2009-12-05 14 views
19

इस कोड पर विचार करें:स्थिर लिंकिंग के लिए .o से .a फ़ाइल क्यों बनाएं?

one.c:

#include <stdio.h> 

int one() { 
    printf("one!\n"); 
    return 1; 
} 

two.c:

#include <stdio.h> 

int two() { 
    printf("two!\n"); 
    return 2; 
} 

prog.c

#include <stdio.h> 

int one(); 
int two(); 

int main(int argc, char *argv[]) 
{ 
    one(); 
    two(); 

    return 0; 
} 

मैं इन कार्यक्रमों को एक साथ लिंक करना चाहते हैं। तो मैं यह करता हूं:

gcc -c -o one.o one.c 
gcc -c -o two.o two.c 
gcc -o a.out prog.c one.o two.o 

यह ठीक काम करता है।

या मैं एक स्थिर पुस्तकालय बना सकते हैं:

ar rcs libone.a one.o 
ar rcs libtwo.a two.o 
gcc prog.c libone.a libtwo.a 
gcc -L. prog.c -lone -ltwo 

तो मेरी सवाल यह है: मैं क्यों दूसरे संस्करण का प्रयोग करेंगे - एक है जहाँ मैं एक "ए" फ़ाइलें बनाई - के बजाय मेरी जोड़ने "। ओ "फाइलें? वे दोनों स्थिर रूप से लिंकिंग प्रतीत होते हैं, तो क्या एक बनाम दूसरे में एक फायदा या वास्तुशिल्प अंतर है?

उत्तर

38

आमतौर पर पुस्तकालय ऑब्जेक्ट फ़ाइलों का संग्रह होते हैं जिनका उपयोग कई प्रोग्रामों में किया जा सकता है।

अपने उदाहरण में कोई फायदा नहीं है, लेकिन आप क्या किया है हो सकता है:

ar rcs liboneandtwo.a one.o two.o 

फिर अपने कार्यक्रम को जोड़ने सरल हो जाता है:

gcc -L. prog.c -loneandtwo 

यह वास्तव में पैकेजिंग की बात है। क्या आपके पास ऑब्जेक्ट फ़ाइलों का एक सेट है जो स्वाभाविक रूप से संबंधित कार्यक्षमता का एक सेट बनाते हैं जिसे कई प्रोग्रामों में पुन: उपयोग किया जा सकता है? यदि ऐसा है, तो वे समझदारी से एक स्थिर पुस्तकालय में संग्रहीत किया जा सकता है, अन्यथा शायद कोई फायदा नहीं है।

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

2

तकनीकी रूप से, परिणाम बिल्कुल वही है। आमतौर पर, आप उपयोगिता कार्यों के लिए पुस्तकालय बनाते हैं, इसलिए लिंकर को दर्जनों ऑब्जेक्ट फ़ाइलों के साथ खिलाने के बजाय, आपको केवल लाइब्रेरी को लिंक करना होगा।

बीटीडब्ल्यू, यह बिल्कुल एक .a फ़ाइल बनाने के लिए कोई समझ नहीं आता है जिसमें केवल एक .o फ़ाइल है।

+2

परिणाम आमतौर पर बहुत अलग होता है। यह इस प्रदूषित उदाहरण में समान होता है। – UncleO

1

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

2

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

कभी-कभी पुस्तकालयों में बड़ी परियोजनाओं को व्यवस्थित करने का अर्थ होता है।

12

अंतर निष्पादन योग्य के आकार में होगा, हालांकि शायद आपके उदाहरण के लिए नहीं।

लाइब्रेरी से लिंक करते समय, केवल आपके निष्पादन योग्य द्वारा उपयोग की जाने वाली बिट्स शामिल की जाती हैं। ऑब्जेक्ट फ़ाइल को लिंक करते समय, आप पूरी चीज लेते हैं।

उदाहरण के लिए, यदि आपके निष्पादन योग्य गणित पुस्तकालय में प्रत्येक गणित फ़ंक्शन को शामिल करना होता है, तो आप केवल एक का उपयोग करते हैं, यह बहुत अधिक उपयोग किए जाने वाले कोड होने और उससे अधिक होने के लिए बहुत बड़ा होगा।

विंडोज के गतिशील लिंकिंग मॉडल के साथ इसे विपरीत करना दिलचस्प है। वहां, ओएस को सभी डीएलएस (गतिशील रूप से जुड़े पुस्तकालयों) को पूरी तरह लोड करना होगा कि आपके निष्पादन योग्य उपयोग, जो रैम में ब्लोट हो सकता है। इस तरह के मॉडल का लाभ यह है कि आपका निष्पादन योग्य स्वयं छोटा है, और लिंक किए गए डीएलएस पहले से ही किसी अन्य निष्पादन योग्य द्वारा उपयोग की जाने वाली मेमोरी में हो सकते हैं, इसलिए उन्हें फिर से लोड करने की आवश्यकता नहीं है।

स्थिर लिंकिंग में, प्रत्येक निष्पादन योग्य के लिए लाइब्रेरी फ़ंक्शन अलग-अलग लोड किए जाते हैं।

0

जब भी मुझे यह प्रश्न पूछा जाता है (मेरी टीम में फ्रेशर्स द्वारा), "क्यों (या कभी-कभी 'क्या है') ए। ए?", मैं नीचे दिए गए उत्तर का उपयोग करता हूं जो .zip को समानता के रूप में उपयोग करता है।

"एक डॉटए सभी डॉट ओह की एक ज़िप फ़ाइल की तरह है जिसे आप अपने exe/lib बनाने के दौरान लिंक करना चाहते हैं। डिस्क स्थान पर बचत, साथ ही किसी को शामिल सभी डॉटओएच के नाम टाइप करने की आवश्यकता नहीं है।"

अब तक, यह उन्हें समझने के लिए प्रतीत होता है। ;)

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