मैं लिनक्स में पुस्तकालयों के संबंध में कुछ बहस में शामिल रहा हूं, और कुछ चीजों की पुष्टि करना चाहता हूं।
यह मेरी समझ के लिए है (कृपया मुझे सही करें अगर मैं गलत हूं और मैं अपनी पोस्ट को बाद में संपादित करूंगा), कि एप्लिकेशन का निर्माण करते समय पुस्तकालयों का उपयोग करने के दो तरीके हैं:
- स्टेटिक लाइब्रेरी (.a फाइलें): लिंक समय पर, संपूर्ण लाइब्रेरी की एक कॉपी को अंतिम एप्लिकेशन में डाल दिया जाता है, ताकि लाइब्रेरी के भीतर कार्य हमेशा कॉलिंग एप्लिकेशन के लिए उपलब्ध रहें
- साझा की गई वस्तुएं (.so फाइलें): लिंक समय पर, वस्तु को उसके एपीआई के खिलाफ संबंधित हेडर (.h) फ़ाइल के माध्यम से सत्यापित किया जाता है। पुस्तकालय वास्तव में रनटाइम तक उपयोग नहीं किया जाता है, जहां इसकी आवश्यकता होती है।
स्थैतिक पुस्तकालयों का स्पष्ट लाभ यह है कि वे संपूर्ण अनुप्रयोग को स्व-निहित होने की अनुमति देते हैं, जबकि गतिशील पुस्तकालयों का लाभ यह है कि ".so" फ़ाइल को बदला जा सकता है (अर्थात: यदि सुरक्षा के कारण इसे अद्यतन करने की आवश्यकता है। बग) को बिना आधार के आवेदन को फिर से शुरू करने की आवश्यकता है।
मैंने सुना है कि कुछ लोग साझा किए गए ऑब्जेक्ट और डायनेमिक लिंक्ड लाइब्रेरी (DLL) के बीच अंतर करते हैं, भले ही वे दोनों ".so" फाइलें हों। क्या लिनक्स या किसी अन्य POSIX अनुरूप OS (यानी: MINIX, UNIX, QNX, आदि) पर C / C ++ विकास की बात आती है तो साझा वस्तुओं और DLL के बीच कोई अंतर है? मुझे बताया गया है कि एक प्रमुख अंतर (अब तक) यह है कि साझा किए गए ऑब्जेक्ट का उपयोग केवल रनटाइम पर किया जाता है, जबकि DLL को एप्लिकेशन के भीतर पहले dlopen () कॉल का उपयोग करके खोला जाना चाहिए।
अंत में, मैंने कुछ डेवलपर्स को "साझा अभिलेखागार" का उल्लेख करते हुए सुना है, जो कि मेरी समझ में, स्वयं स्थिर पुस्तकालय भी हैं, लेकिन कभी भी सीधे आवेदन द्वारा उपयोग नहीं किए जाते हैं। इसके बजाय, अन्य स्टैटिक लाइब्रेरी साझा आर्काइव से निर्मित स्टैटिक लाइब्रेरी में कुछ (लेकिन सभी नहीं) कार्यों / संसाधनों को खींचने के लिए "साझा अभिलेखागार" के खिलाफ लिंक करेंगे।
आपकी सहायता के लिए अग्रिम धन्यवाद।
अपडेट करें
जिस संदर्भ में मुझे ये शर्तें प्रदान की गई थीं, यह प्रभावी रूप से त्रुटिपूर्ण शब्द था, जिसका उपयोग विंडोज डेवलपर्स की एक टीम ने किया था, जिसे लिनक्स सीखना था। मैंने उन्हें सही करने की कोशिश की, लेकिन (गलत) भाषा के मानक अटक गए।
- साझा की गई वस्तु: एक पुस्तकालय जो कार्यक्रम शुरू होने पर स्वचालित रूप से एक कार्यक्रम में जुड़ा हुआ है, और एक स्टैंडअलोन फ़ाइल के रूप में मौजूद है। लाइब्रेरी को संकलन समय पर लिंकिंग सूची में शामिल किया गया है (जैसे:
LDOPTS+=-lmylib
एक पुस्तकालय फ़ाइल नाम के लिएmylib.so
)। लाइब्रेरी को संकलन समय पर मौजूद होना चाहिए, और जब आवेदन शुरू होता है। - स्टैटिक लाइब्रेरी: एक लाइब्रेरी जो कि वास्तविक समय में एक ही (बड़े) एप्लिकेशन के निर्माण के लिए वास्तविक प्रोग्राम में विलीन हो जाती है, जिसमें एप्लिकेशन कोड और लाइब्रेरी कोड होता है जो प्रोग्राम बनने पर स्वचालित रूप से एक प्रोग्राम में लिंक हो जाता है, और अंतिम बाइनरी जिसमें दोनों होते हैं मुख्य कार्यक्रम और पुस्तकालय ही एकल स्टैंडअलोन बाइनरी फ़ाइल के रूप में मौजूद हैं। लाइब्रेरी को संकलन समय पर लिंकिंग सूची में शामिल किया गया है (यानी:
LDOPTS+=-lmylib
mylib.a नामक लाइब्रेरी फ़ाइल के लिए)। पुस्तकालय को संकलन के समय उपस्थित होना चाहिए। - डीएलएल: अनिवार्य रूप से एक साझा वस्तु के रूप में ही है, लेकिन संकलन समय पर लिंकिंग सूची में शामिल किए जाने के बजाय, लाइब्रेरी को
dlopen()
/dlsym()
आदेशों के माध्यम से लोड किया जाता है ताकि लाइब्रेरी को प्रोग्राम को संकलित करने के लिए बिल्ड समय पर मौजूद होने की आवश्यकता न हो। इसके अलावा, लाइब्रेरी को एप्लिकेशन स्टार्टअप या संकलित समय पर (आवश्यक रूप से) उपस्थित होने की आवश्यकता नहीं है , क्योंकि यह केवल उसी समय की आवश्यकता है जबdlopen
/dlsym
कॉल किए जाते हैं। - साझा संग्रह: अनिवार्य रूप से एक स्थिर पुस्तकालय के समान है, लेकिन "निर्यात-साझा" और "-fPIC" झंडे के साथ संकलित है। लाइब्रेरी को संकलन समय पर लिंकिंग सूची में शामिल किया गया है (जैसे:
LDOPTS+=-lmylibS
एक पुस्तकालय फ़ाइल नाम के लिएmylibS.a
)। दोनों के बीच अंतर यह है कि इस अतिरिक्त ध्वज की आवश्यकता तब होती है जब एक साझा वस्तु या डीएलएल सांकेतिक रूप से साझा संग्रह को अपने कोड में लिंक करना चाहता है और साझा किए गए ऑब्जेक्ट में अन्य कार्यक्रमों के लिए उपलब्ध कराने में सक्षम है, न कि केवल उनका उपयोग करने के बजाय। DLL को आंतरिक। यह उस स्थिति में उपयोगी होता है जब कोई व्यक्ति आपको स्थैतिक पुस्तकालय प्रदान करता है, और आप इसे एसओ के रूप में फिर से तैयार करना चाहते हैं। पुस्तकालय को संकलन के समय उपस्थित होना चाहिए।
अतिरिक्त अद्यतन
" DLL
" और " shared library
" के बीच का अंतर केवल उस समय की कंपनी में काम किया हुआ (आलसी, गलत) बोलचाल का था (विंडोज डेवलपर्स को लिनक्स विकास में स्थानांतरित करने के लिए मजबूर किया जा रहा है, और शब्द अटक गया), ऊपर वर्णित विवरणों का पालन करना।
इसके अतिरिक्त, S
"साझा अभिलेखागार" के मामले में पुस्तकालय के नाम के बाद " " शाब्दिक, केवल उस कंपनी में उपयोग किया जाने वाला एक सम्मेलन था, और सामान्य रूप से उद्योग में नहीं।
.a
फ़ाइलें, "एक" वास्तव में "archove" के लिए खड़ा है, और यह बस वस्तु फ़ाइलों का एक संग्रह है। आधुनिक लिंकर्स को लाइब्रेरी में शामिल करने की आवश्यकता नहीं होने के लिए पर्याप्त अच्छा होना चाहिए, बस संग्रह में ऑब्जेक्ट्स फ़ाइलों की आवश्यकता होती है, और यहां तक कि संदर्भित ऑब्जेक्ट फ़ाइलों में कोड / डेटा के अनुभागों का भी उपयोग कर सकते हैं।