स्टैटिक लाइब्रेरी की .lib फ़ाइल के अंदर क्या है, स्टेटिकली डायनेमिक लाइब्रेरी और डायनेमिकली लिंक्ड डायनेमिक लाइब्रेरी?


84

स्टेटिक लाइब्रेरी की एक .lib फ़ाइल के अंदर, स्टेटिकली कनेक्टेड डायनेमिक लाइब्रेरी और डायनेमिकली लिंक्ड डायनेमिक लाइब्रेरी?

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


4
यह ध्यान दिया जा सकता है कि सवाल एमएस विंडोज प्लेटफॉर्म के बारे में है।
क्यूबसप्ला 42

जवाबों:


147

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

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

डायनामिक लाइब्रेरी का उपयोग करने के लिए आपको एक .lib फ़ाइल की आवश्यकता नहीं है, लेकिन एक के बिना आप DLL के कार्यों को अपने कोड में सामान्य कार्यों के रूप में नहीं मान सकते हैं। इसके बजाय आपको LoadLibraryDLL को लोड करने के लिए मैन्युअल रूप से कॉल करना चाहिए (और FreeLibraryजब आप कर रहे हों), और GetProcAddressDLL में फ़ंक्शन या डेटा आइटम का पता प्राप्त करने के लिए। फिर आपको इसका उपयोग करने के लिए दिए गए पते को एक उपयुक्त पॉइंटर-टू-फंक्शन में डालना होगा।


4
एक लंबी खोज के बाद, IMO, मुझे एक लिब और dll का उपयोग करने के कारण का सबसे अच्छा जवाब मिला। धन्यवाद
जीत

@ एंथनी विलियम्स जब आपने कहा, "एक गतिशील पुस्तकालय के लिए, .lib फ़ाइल में लाइब्रेरी से निर्यात किए गए कार्यों और डेटा तत्वों की एक सूची होती है, और वह जानकारी जिसके बारे में वे DLL से आए थे।", वह है .lib फ़ाइल जिसे "आयात" कहा जाता है। पुस्तकालय "जो सामान्य .lib फ़ाइलों (" स्थिर पुस्तकालय ") से अलग है?
सितबंर

हां, यह एक आयात पुस्तकालय है
एंथनी विलियम्स

13

मैंने हंस के उत्तर का उत्तर यहां भी उपयोगी पाया। यह हवा को साफ करता है कि दो प्रकार की लिबास फाइलें हो सकती हैं।

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

लेकिन DLL के लिए अधिक प्रासंगिक, एक LIB फ़ाइल एक आयात लाइब्रेरी भी हो सकती है। यह तो एक साधारण छोटी फ़ाइल है जिसमें DLL का नाम और DLL द्वारा निर्यात किए गए सभी कार्यों की एक सूची शामिल है। जब आप DLL का उपयोग करने वाले प्रोग्राम का निर्माण करते हैं, तो आपको इसे लिंकर को प्रदान करना होगा ताकि यह पता चले कि बाहरी पहचानकर्ता वास्तव में DLL द्वारा निर्यात किया गया फ़ंक्शन है। EXE के लिए आयात तालिका में प्रविष्टियाँ जोड़ने के लिए लिंकर आयात लायब्रेरी का उपयोग करता है। इसके बाद विंडोज द्वारा रनटाइम में उपयोग किया जाता है ताकि यह पता लगाया जा सके कि प्रोग्राम को चलाने के लिए DLL को क्या लोड करना है।


8

एक स्थिर लाइब्रेरी में, lib फ़ाइल में लाइब्रेरी द्वारा प्रदान किए गए कार्यों के लिए वास्तविक ऑब्जेक्ट कोड होता है। साझा संस्करण में (जिसे आपने स्टेटिकली लिंक्ड डायनामिक लाइब्रेरी के रूप में संदर्भित किया है), रनटाइम पर डायनेमिक लिंकेज को स्थापित करने के लिए बस पर्याप्त कोड है।

मुझे "गतिशील रूप से जुड़े गतिशील पुस्तकालयों" (प्रोग्रामेटिक रूप से लोड) के बारे में निश्चित नहीं है। क्या आप भी उस मामले में एक .लिब के साथ लिंक करते हैं?

संपादित करें:

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

यहाँ एक सारांश है:

लिंकिंग ing स्टेटिक | DLL | LoadLibrary
========= ǁ =============== | ====================== | = ==================
एपीआई कोड-आपके कॉम में- | DLL में | डीएलएल में
जीवन ǁ ढेर कार्यक्रम | |
--------- ǁ --------------- | ---------------------- | - ------------------
समारोह Function प्रत्यक्ष, हो सकता है तालिका के माध्यम से अप्रत्यक्ष | आपके माध्यम से अप्रत्यक्ष
कॉल calls हो elided है | स्वचालित रूप से भरा हुआ | खुद के कार्य ptrs
--------- ǁ --------------- | ---------------------- | - ------------------
बोझ iler कम्पाइलर | कम्पाइलर / ओएस | आप / ओएस

स्टैटिकली लिंक्ड लाइब्रेरीज़ से मेरा मतलब है कि .lib फ़ाइल का उपयोग करना और संकलन समय पर .dll को लिंक करना। डायनामिक लिंकिंग Win32 API के लाइब्रेरीलोडेरेक्स () फ़ंक्शन का उपयोग करके रनटाइम पर .dll को लिंक कर रहा है।
सुल्ला

6

लिंकर द्वारा एक लीब फाइल को पढ़ा जाता है और निष्पादन के दौरान एक dll फाइल का उपयोग किया जाता है। निष्पादन के दौरान एक आवश्यक फ़ाइल अनिवार्य रूप से बेकार है और एक लिंकर एक डीएल फ़ाइल पढ़ने में असमर्थ है (संभवतः यहां एक तरह से अप्रासंगिक तरीके को छोड़कर)।

स्टैटिक और डायनेमिक लिंकिंग के लिए काम कर रही फाइलों के बीच का अंतर भ्रामक हो सकता है लेकिन अगर आप थोड़ा इतिहास समझ लेते हैं तो यह बहुत स्पष्ट हो जाता है।

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

डायनेमिक लिंकिंग को कार्यान्वित करने के लिए, Microsoft ने ऐसी कामेच्छा वाली फाइलों के उपयोग को संशोधित किया, जो वे किसी obj फ़ाइल के स्थानों के बजाय dll फ़ाइल को संदर्भित करते हैं। इसके अलावा, सभी जानकारी जो एक स्थैतिक लिंक के लिए एक पुस्तकालय में है, एक गतिशील लिंक के लिए समान है। वे सभी जहाँ तक जानकारी है उनमें एक डायनामिक लिंक के लिए एक डीबीडी फ़ाइल dll फ़ाइल निर्दिष्ट करता है।


1

Dll के "चीज़ें" एक exe की तरह हैं (किसी भी प्रकार का डेटा, आयात, निर्यात, रीड / राइट / एक्ज़ीक्यूटिव सेक्शन हो सकता है) लेकिन अंतर यह है कि एक exe फ़ाइल केवल एंट्री पॉइंट (फंक्शन) को एक्सपोर्ट करती है लेकिन dll के एक्सपोर्ट को / कई कार्य।

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