स्थैतिक पुस्तकालय

कंप्यूटर विज्ञान में, एक स्थैतिक लाइब्रेरी या स्थैतिक-लिंक्ड लाइब्रेरी रूटीन, बाहरी कार्यों और चर का एक सेट है जिसे संकलन-समय पर एक कॉलर में हल किया जाता है और एक संकलक, लिंकर (कंप्यूटिंग), या बाइंडर द्वारा लक्ष्य एप्लिकेशन में कॉपी किया जाता है, जो एक ऑब्जेक्ट फ़ाइल और एक स्टैंडअलोन कार्यक्रम बनाता है। स्टैंड-अलोन निष्पादन योग्य। यह निष्पादन योग्य और इसे संकलित करने की प्रक्रिया दोनों को प्रोग्राम के स्थिर निर्माण के रूप में जाना जाता है। ऐतिहासिक रूप से, पुस्तकालय केवल स्थिर हो सकते हैं। स्टेटिक लाइब्रेरीज़ को या तो बिल्डिंग/लिंकिंग के दौरान अन्य स्टैटिक लाइब्रेरीज़ और ऑब्जेक्ट फ़ाइलों के साथ विलय कर दिया जाता है ताकि एकल निष्पादन योग्य बनाया जा सके या रन टाइम (प्रोग्राम जीवनचक्र चरण) पर लोड किया जा सके। कंपाइल-टाइम/लिंक-टाइम पर निर्धारित स्थैतिक स्मृति आवंटन पर उनके संबंधित निष्पादन योग्य के  पता स्थान  में रन-टाइम लोड किया जाता है।

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

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

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

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

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

C/C++
में स्थिर पुस्तकालय बनाना स्टेटिक लाइब्रेरीज़ को C (प्रोग्रामिंग भाषा) या C++ में आसानी से बनाया जा सकता है। ये दो भाषाएँ अन्य सुविधाएँ प्रदान करने के अलावा, बाहरी या आंतरिक लिंकेज को इंगित करने के लिए सी|स्टोरेज-क्लास विनिर्देशकों में स्टोरेज कक्षाएं प्रदान करती हैं। ऐसी लाइब्रेरी बनाने के लिए, निर्यात किए गए फ़ंक्शंस/प्रक्रियाओं और अन्य ऑब्जेक्ट वेरिएबल्स को बाहरी लिंकेज के लिए निर्दिष्ट किया जाना चाहिए (यानी सी स्टेटिक (कीवर्ड) का उपयोग न करके | कीवर्ड)। स्टेटिक लाइब्रेरी फ़ाइल नाम आमतौर पर होते हैं.a यूनिक्स जैसी प्रणालियों पर विस्तार और.lib माइक्रोसॉफ्ट विंडोज़ पर एक्सटेंशन।

उदाहरण के लिए, यूनिक्स जैसी प्रणाली पर, नामक एक संग्रह बनाने के लिए libclass.aफ़ाइलों से class1.o, class2.o, class3.o, निम्नलिखित कमांड का उपयोग किया जाएगा: एआर आरसीएस libclass.a class1.o class2.o class3.o किसी प्रोग्राम को संकलित करना जिस पर निर्भर करता है class1.o, class2.o, और class3.o, कोई यह कर सकता है: cc main.c libclass.a या अगर libclass.a को मानक पुस्तकालय पथ में रखा गया है, जैसे /usr/local/lib) सीसी मेन.सी -एलक्लास या (लिंकिंग के दौरान) एलडी ... मुख्य.ओ -एलक्लास ... के बजाय: cc main.c class1.o class2.o class3.o

यह भी देखें

 * स्थैतिक निर्माण
 * लाइब्रेरी (कंप्यूटिंग)
 * लिंकर (कंप्यूटिंग)
 * लोडर (कंप्यूटिंग)
 * साझा पुस्तकालय
 * डायनामिक-लिंक लाइब्रेरी (DLL, .dll)
 * बाहरी चर
 * ऑब्जेक्ट फ़ाइल
 * प्रीबाइंडिंग
 * JAR (फ़ाइल स्वरूप)