2010-04-15 32 views
428

स्थिर और साझा पुस्तकालयों के बीच क्या अंतर है?स्थिर और साझा पुस्तकालयों के बीच अंतर?

मैं ग्रहण का उपयोग करता हूं और स्टेटिक पुस्तकालयों और साझा पुस्तकालयों सहित कई परियोजना प्रकार हैं? क्या किसी के पास दूसरा फायदा है?

+3

विकिपीडिया में स्थिर, गतिशील और साझा पुस्तकालयों के बीच भेद के एक [अच्छा वर्णन] (http://en.wikipedia.org/wiki/Library_%28computing%29) है। –

उत्तर

595

साझा पुस्तकालय हैं पर भरोसा करने की बजाय अपने स्वयं के, पुस्तकालयों में से शायद बेहतर संस्करण का उपयोग करने के (क्षमता की पेशकश या Windows .dll में, या ओएस एक्स। dylib में) फ़ाइलें। लाइब्रेरी से संबंधित सभी कोड इस फ़ाइल में हैं, और इसे रन-टाइम पर प्रोग्राम का उपयोग करके संदर्भित किया जाता है। साझा लाइब्रेरी का उपयोग करने वाला एक प्रोग्राम केवल उस कोड के संदर्भ में आता है जो साझा लाइब्रेरी में उपयोग करता है।

स्टेटिक लाइब्रेरी .a (या Windows .lib में) फ़ाइलें हैं। लाइब्रेरी से संबंधित सभी कोड इस फ़ाइल में हैं, और यह सीधे संकलन समय पर प्रोग्राम में जुड़ा हुआ है। एक स्थिर पुस्तकालय का उपयोग करने वाला एक प्रोग्राम उस कोड की प्रतियां लेता है जो यह स्थिर पुस्तकालय से उपयोग करता है और इसे प्रोग्राम का हिस्सा बनाता है। [विंडोज़ भी है।lib फ़ाइलें जो .dll फ़ाइलों को संदर्भित करने के लिए उपयोग की जाती हैं, लेकिन वे पहले के समान कार्य करते हैं]।

प्रत्येक विधि में फायदे और नुकसान हैं।

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

स्टेटिक पुस्तकालयों द्विआधारी के समग्र आकार में वृद्धि, लेकिन यह है कि आप पुस्तकालय है कि इस्तेमाल किया जा रहा की एक प्रति के साथ ले जाने के लिए की आवश्यकता नहीं है। चूंकि कोड संकलन समय पर जुड़ा हुआ है, इसलिए कोई अतिरिक्त रन-टाइम लोडिंग लागत नहीं है। कोड बस वहाँ है।

व्यक्तिगत रूप से, मैं साझा पुस्तकालयों को पसंद करता हूं, लेकिन यह सुनिश्चित करने के लिए स्थिर पुस्तकालयों का उपयोग करते हैं कि बाइनरी में कई बाहरी निर्भरताएं नहीं मिल सकती हैं, जिन्हें सी ++ मानक पुस्तकालय के विशिष्ट संस्करण या बूस्ट के विशिष्ट संस्करण सी ++ पुस्तकालय।

+2

के हिस्से के रूप में जोड़ा जाता है "साझा वस्तु को ... कार्यात्मक रूप से समतुल्य रूप से प्रतिस्थापित करें, लेकिन प्रदर्शन [सुधार] कर सकते हैं": विशेष रूप से , एपीआई के अर्थपूर्ण उपयोग में अनुप्रयोग कॉलर-फेसिंग कार्यक्षमता (एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस: फ़ंक्शन हस्ताक्षर और प्रकार सहित चर), लेकिन कार्यान्वयन-पक्ष कार्यक्षमता perf से अधिक में भिन्न हो सकती है .: उदाहरण फ़ंक्शन हमेशा फ़ाइल पर लॉग इन करता है -> टीसीपी पर भी लॉग ऑन करें सर्वर: पोर्ट $ MY_APP_LOG_SERVER में अपेक्षित है। –

+1

"[.sos incur a] छोटी अतिरिक्त लागत कार्यों के निष्पादन के लिए "- यह * संभव * है (यदि फ़ंक्शन समूह/ऑर्डरिंग स्थिर लिंक में कैश इलाके के लिए अनुकूलित किया गया है, या ओएस/लोडर/कंपाइलर/आर्किटेक्चर जैसे क्रॉस-सेगमेंट/बड़े-पॉइंटर परफ के कारण अनुकूलित किया गया है। जुर्माना), लेकिन कई आर्किटेक्चर/कंपाइलर-सेटिंग्स पर गतिशील लिंकर सटीक कॉलिंग मशीन ऑपकोड बनाने के लिए कॉल को पैच करता है। –

+2

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

24

एक स्थिर पुस्तकालय के लिए, लिंकर द्वारा लाइब्रेरी से कोड निकाला जाता है और उस बिंदु पर अंतिम निष्पादन योग्य बनाने के लिए उपयोग किया जाता है जब आप अपना आवेदन संकलित/बनाते हैं। अंतिम निष्पादन योग्य के पास रन टाइम

साझा लाइब्रेरी के लिए, संकलक/लिंकर जांचता है कि आपके द्वारा लिंक किए गए नाम लाइब्रेरी में मौजूद हैं, जब एप्लिकेशन बनाया गया है, लेकिन उनके कोड को स्थानांतरित नहीं करता है आवेदन पत्र। रन टाइम पर, साझा लाइब्रेरी उपलब्ध होनी चाहिए।

सी प्रोग्रामिंग भाषा में स्थिर या साझा पुस्तकालयों की कोई अवधारणा नहीं है - वे पूरी तरह कार्यान्वयन सुविधा हैं।

व्यक्तिगत रूप से, मैं स्थिर पुस्तकालयों का उपयोग करना पसंद करता हूं, क्योंकि यह सॉफ़्टवेयर वितरण को सरल बनाता है। हालांकि, यह एक राय है कि अतीत में कितना (लाक्षणिक) रक्त बहाया गया है।

+3

+1 "सी प्रोग्रामिंग भाषा के लिए स्थिर या साझा पुस्तकालयों की कोई अवधारणा नहीं है - वे पूरी तरह कार्यान्वयन सुविधा हैं।" – Tiger

14

साझा पुस्तकालयों का सबसे महत्वपूर्ण लाभ यह है कि स्मृति में लोड कोड की केवल एक प्रति है, इससे कोई फर्क नहीं पड़ता कि पुस्तकालय का उपयोग कितनी प्रक्रियाएं कर रहे हैं। स्थैतिक पुस्तकालयों के लिए प्रत्येक प्रक्रिया को कोड की अपनी प्रति प्राप्त होती है। इससे महत्वपूर्ण स्मृति बर्बादी हो सकती है।

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

+1

निष्पादन योग्य छवि डिस्क पर, साथ ही स्मृति में, स्थिर libs का उपयोग करते समय बड़ी है। – JustJeff

+0

सही है, मैं यह कह रहा था कि जब मैं कहता हूं कि सब कुछ आपके आवेदन में बंडल किया गया है। – Jasmeet

46

सरलीकृत:

  • स्टेटिक लिंकिंग: एक बड़े निष्पादन
  • गतिशील लिंकिंग: एक छोटे से निष्पादन के साथ साथ एक या अधिक पुस्तकालय फ़ाइलें (विंडोज पर .dll फ़ाइलें, लिनक्स पर .so, या .dylib MacOS पर)
26

स्टेटिक पुस्तकालयों को एक आवेदन के हिस्से के रूप में संकलित किया जाता है, जबकि साझा पुस्तकालय नहीं होते हैं। जब आप एक ऐसे एप्लिकेशन को वितरित करते हैं जो साझा मुक्तियों पर निर्भर करता है, पुस्तकालय, उदाहरण के लिए। एमएस विंडोज़ पर डीएलएल स्थापित करने की जरूरत है।

स्थैतिक पुस्तकालयों के फायदे यह है कि एप्लिकेशन चलाने वाले उपयोगकर्ता के लिए कोई निर्भरता आवश्यक नहीं है - उदा। उन्हें जो कुछ भी उनके डीएलएल को अपग्रेड नहीं करना है ... नुकसान यह है कि आपका आवेदन आकार में बड़ा है क्योंकि आप इसे सभी पुस्तकालयों के साथ भेज रहे हैं।

साथ ही छोटे अनुप्रयोगों के लिए अग्रणी, साझा पुस्तकालयों उपयोगकर्ता बल्कि एक है कि आवेदन का हिस्सा है .so

+2

DLL नरक के रूप में यह ज्ञात है – gheese

+1

"स्टेटिक पुस्तकालयों को एक अनुप्रयोग के हिस्से के रूप में संकलित किया जाता है" ... स्थैतिक पुस्तकालयों को स्थैतिक पुस्तकालयों के रूप में संकलित किया जाता है और एक अनुप्रयोग – user463035818

323

एक स्थिर पुस्तकालय एक किताबों की दुकान की तरह है, और एक साझा पुस्तकालय की तरह एक पुस्तकालय है ...। पूर्व के साथ, आपको घर लेने के लिए पुस्तक/कार्य की अपनी प्रति प्राप्त होती है; बाद में आप और हर कोई लाइब्रेरी में उसी पुस्तक/फ़ंक्शन का उपयोग करने के लिए जाता है। तो कोई भी जो (साझा) लाइब्रेरी का उपयोग करना चाहता है उसे यह जानने की जरूरत है कि यह कहां है, क्योंकि आपको पुस्तक/फ़ंक्शन "जाना" है। एक स्थिर पुस्तकालय के साथ, पुस्तक/फ़ंक्शन आपके पास है, और आप इसे अपने घर/कार्यक्रम में रखते हैं, और एक बार जब आप इसे प्राप्त कर लेते हैं तो आपको परवाह नहीं है कि आपको कहां या कब मिला।

2

सभी अन्य उत्तर के शीर्ष पर, एक बात अभी तक mentionned नहीं decoupling है:

मुझे एक वास्तविक दुनिया उत्पादन कोड के बारे में बात करते हैं, कि मैं के साथ काम कर दिया गया है:

एक बहुत बड़ी सॉफ्टवेयर, > 300 परियोजनाओं (दृश्य स्टूडियो के साथ) से बना है, ज्यादातर स्थिर लिब के रूप में निर्मित होते हैं और आखिरकार सभी लिंक एक साथ निष्पादन योग्य होते हैं, आप निम्न समस्याओं का सामना करते हैं:

-लिंक समय बहुत लंबा है। आप लिंक के 15 मिनट से अधिक अंत, के लिए की स्मृति की जांच उपकरण है कि साधन कोड होना चाहिए की तरह संकलन समय की 10s -कुछ उपकरण इतनी बड़ी निष्पादन के साथ अपने घुटने पर कर रहे हैं, कहते हैं कि चलो हो सकता है। आप मूर्खों के रूप में देखा गया सीमा तक पहुंचने में पड़ सकते हैं।

अधिक समस्याग्रस्त अपने सॉफ्टवेयर के decoupling है: यह असली दुनिया उदाहरण पर, शीर्ष लेख हर परियोजना की फ़ाइलों को किसी भी अन्य परियोजनाओं से reacheable थे। नतीजतन एक डेवलपर के लिए निर्भरता जोड़ने के लिए यह बेहद आसान था; यह केवल हेडर को शामिल करने के बारे में था, क्योंकि अंत में लिंक को सभी प्रतीकों को मिल जाएगा। यह भयानक साइकलिंग निर्भरताओं और पूर्ण गड़बड़ी से समाप्त होता है।

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

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