2009-05-27 9 views
153

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

उत्तर

220

स्थिर पुस्तकालय (एलआईबी) और गतिशील पुस्तकालय (डीएलएल) हैं।

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

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

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

+49

यह बताता है कि '.LIB' फ़ाइलें या तो स्थिर पुस्तकालय (ऑब्जेक्ट फाइलें) या आयात पुस्तकालय हो सकती हैं (लिंकर को डीएलएल से लिंक करने की अनुमति देने के लिए प्रतीक शामिल हैं)। [मुझे आश्चर्य है कि ऐसा क्यों है।] (Http://stackoverflow.com/q/6421693/269126) – Lumi

+1

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

10

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

24

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

+0

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

+0

लेकिन एलआईबी भी अलग है, है ना? तो एक अटैकर बस एलआईबी का विश्लेषण कर सकता था। या यह एक आम परिदृश्य है कि एलआईबी जनता के लिए सुलभ नहीं है? –

+3

एलआईबी "पृथक" भी है, जहां तक ​​संकलक प्रक्रिया का संबंध है, लेकिन एक बार जब लिंकर एक साथ भागों को रखता है, तो LIB EXE का हिस्सा होता है और इसे आपके कोड से अलग नहीं किया जा सकता है। – mox

7

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

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

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

2

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

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

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

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