DLL और LIB फाइलें - क्या और क्यों?


214

मुझे डीएलएल और एलआईबी के बारे में बहुत कम पता है कि इसके अलावा वे प्रोग्राम को ठीक से चलाने के लिए जरूरी कोड शामिल हैं - लाइब्रेरी। लेकिन कंपाइलर उन्हें क्यों उत्पन्न करते हैं? क्या सिर्फ एक निष्पादन योग्य में सभी कोड को शामिल करना आसान नहीं होगा? और DLL और LIB के बीच क्या अंतर है?


जवाबों:


298

स्टैटिक लाइब्रेरीज़ (LIB) और डायनेमिक लाइब्रेरीज़ (DLL) हैं - लेकिन ध्यान दें कि .LIB फाइल्स या तो स्टैटिक लाइब्रेरीज़ (ऑब्जेक्ट फाइल्स वाली) या इंपोर्ट लाइब्रेरीज़ हो सकती हैं (जिसमें डीएल से लिंक करने के लिए लिंकर को अनुमति देने के लिए सिंबल होते हैं)।

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

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

एक उदाहरण के रूप में, 'C' में लिखे गए लगभग हर प्रोग्राम को 'C रनटाइम लाइब्रेरी' नामक लाइब्रेरी से कार्यों की आवश्यकता होगी, हालांकि कुछ प्रोग्रामों को सभी कार्यों की आवश्यकता होगी। सी रनटाइम स्थिर और गतिशील दोनों संस्करणों में आता है, इसलिए आप यह निर्धारित कर सकते हैं कि आपका प्रोग्राम किस संस्करण का उपयोग विशेष आवश्यकताओं के आधार पर करता है।


80
यह पता लगाता है कि .LIBफाइलें या तो स्टैटिक लाइब्रेरी (ऑब्जेक्ट फाइल्स से युक्त) या इंपोर्ट लाइब्रेरी हो सकती हैं (जिसमें किसी DLL से लिंक करने के लिए लिंकर को अनुमति देने के लिए प्रतीक होते हैं)। मैं सोच रहा हूं कि ऐसा क्यों है।
लूमी

2
अच्छे खर्च! कोड साझा किया गया है और डेटा (प्रति डिफ़ॉल्ट) एक Dll का उपभोग करने वाले एप्लिकेशन (नों) के बीच साझा नहीं किया गया है।
मोक्स

4
@Lumi: अच्छी बात है। DLL के संदर्भ में हमारे पास दो प्रकार के लिंक हैं। उपयुक्त लिंकिंग , जब हमारे पास .libउपयुक्त हेडर के साथ DLL निर्माता द्वारा प्रदान की गई फ़ाइल है; यह .libकेवल लक्ष्य DLL का विवरणक है, इसमें पते, प्रवेश बिंदु, आदि हैं, लेकिन कोई कोड नहीं। इसे .libलिंकर को पास करना होगा। दूसरा एक स्पष्ट लिंकिंग है जब हम LoadLibraryफ़ंक्शन के साथ मैन्युअल रूप से लोड करके DLL का उपयोग करते हैं । इस प्रकार में हमें उस .libफ़ाइल की आवश्यकता नहीं है , लेकिन हमें DLL निर्यात, उनके पते और पॉइंटर्स के माध्यम से इन कार्यों को कॉल करने के लिए थोड़ा प्रयास करना चाहिए।
इटाची

37

एक अन्य पहलू सुरक्षा (आपत्ति) है। एक बार कोड का एक टुकड़ा मुख्य एप्लिकेशन से निकाला जाता है और "अलग" डायनेमिक-लिंक लाइब्रेरी में डाल दिया जाता है, तो कोड को हमला करना, विश्लेषण करना (रिवर्स-इंजीनियर) करना आसान होता है, क्योंकि यह अलग हो गया है। जब LIB लाइब्रेरी में कोड का एक ही टुकड़ा रखा जाता है, तो यह संकलित (लिंक्ड) टारगेट एप्लिकेशन का हिस्सा होता है, और इस प्रकार उस टार्गेट को बाकी लक्ष्य बायनेरिज़ से अलग करना (अलग करना) कठिन होता है।


मेरे लिए सुरक्षा पहलू नया था। क्या उक्त तर्क एक मूल अप्रबंधित C ++ डीएल को कॉल करने वाले C # एप के मामले में सही है?
मार्टिन

1
लेकिन LIB भी अलग है, है ना? इसलिए एक हमलावर केवल LIB का विश्लेषण कर सकता है। या यह एक सामान्य परिदृश्य है कि LIB जनता के लिए सुलभ नहीं है?
निक रसलर

8
LIB "पृथक" भी है, जहां तक ​​संकलक प्रक्रिया का संबंध है, लेकिन एक बार लिंकर ने पुर्जों को एक साथ रखा, LIB EXE का हिस्सा है और इसे आपके स्वयं के कोड से विभेदित नहीं किया जा सकता है।
मोक्स

17

कोड को निष्पादन योग्य में संकलित करने के बजाय DLL / LIB बनाने का एक महत्वपूर्ण कारण पुन: उपयोग और स्थानांतरण है। औसत जावा या .NET एप्लिकेशन (उदाहरण के लिए) सबसे अधिक संभावना 3 जी पार्टी (या फ्रेमवर्क) पुस्तकालयों का उपयोग करेगा। आपके एप्लिकेशन में सभी 3 पार्टी कोड को संकलित करने के बजाय, एक पूर्व-निर्मित लाइब्रेरी के खिलाफ संकलन करना बहुत आसान और तेज़ है। अपने कोड को पुस्तकालयों में संकलित करना भी अच्छी डिजाइन प्रथाओं को प्रोत्साहित करता है, जैसे कि आपकी कक्षाओं को विभिन्न प्रकार के अनुप्रयोगों में उपयोग करने के लिए डिज़ाइन करना।


7

डीएलएल कार्यों का एक पुस्तकालय है जो अन्य निष्पादन योग्य कार्यक्रमों के बीच साझा किया जाता है। बस अपनी विंडो / सिस्टम 32 डायरेक्टरी में देखें और आपको उनमें से दर्जनों मिल जाएंगे। जब आपका प्रोग्राम DLL बनाता है तो यह आम तौर पर एक लीब फाइल भी बनाता है ताकि एप्लिकेशन * .exe प्रोग्राम उन प्रतीकों को हल कर सके जो DLL में घोषित किए गए हैं।

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

आप DLL और लिबास कैसे बनाते हैं यह आपके द्वारा उपयोग किए जाने वाले कंपाइलर पर निर्भर करता है। प्रत्येक कंपाइलर इसे अलग तरीके से करता है।


4

एक अन्य अंतर प्रदर्शन में निहित है।

चूँकि DLL रनटाइम पर .exe (s), .exe (s) और DLL शेयर्ड मेमोरी कॉन्सेप्ट के साथ काम करता है और इसलिए प्रदर्शन अपेक्षाकृत लिंकिंग से अपेक्षाकृत कम है।

दूसरी ओर, .lib वह कोड है जो अनुरोध करने वाली प्रत्येक प्रक्रिया में संकलित समय पर सांख्यिकीय रूप से जुड़ा होता है। इसलिए .exe (s) में एकल मेमोरी होगी, इस प्रकार प्रक्रिया के प्रदर्शन में वृद्धि होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.