c++ - सबस - सार्वजनिक पुस्तकालय जयपुर राजस्थान




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

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

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


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

मुझे एक असली दुनिया के उत्पादन कोड के बारे में बात करने दो, कि मैं इससे निपट रहा हूं:

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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


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





static-libraries