DLL फ़ाइल से लिंक हो सकता है परोक्ष में संकलन लिंक समय, या स्पष्ट रूप से रन टाइम पर। किसी भी तरह से, DLL मेमोरी स्पेस में लोड हो जाता है, और इसके सभी निर्यात किए गए प्रवेश बिंदु आवेदन के लिए उपलब्ध हैं।
तो रन टाइम पर स्पष्ट रूप से प्रयोग किया जाता है, आप का उपयोग LoadLibrary()
और GetProcAddress()
मैन्युअल रूप से करने के लिए DLL लोड और कार्यों आप कॉल करने की आवश्यकता की ओर इशारा मिलता है।
यदि प्रोग्राम बनाया गया है, तो स्पष्ट रूप से जुड़ा हुआ है, तो प्रोग्राम द्वारा उपयोग किए जाने वाले प्रत्येक DLL निर्यात के लिए स्टब्स को आयात लाइब्रेरी से प्रोग्राम में लिंक किया जाता है, और प्रक्रिया शुरू होने पर EXE और DLL लोड होने पर वे स्टब्स अपडेट हो जाते हैं। (हां, मैंने यहां थोड़ा और अधिक सरलीकृत किया है ...)
उन स्टब्स को कहीं से आने की जरूरत है, और Microsoft उपकरण श्रृंखला में वे एक विशेष रूप से .LIB फ़ाइल से आते हैं, जिसे a कहा जाता है आयात लाइब्रेरी । आवश्यक .LIB आमतौर पर DLL के समान ही बनाया जाता है, और DLL से निर्यात होने वाले प्रत्येक फ़ंक्शन के लिए एक स्टब होता है।
भ्रामक रूप से, उसी लाइब्रेरी के स्थिर संस्करण को .LIB फ़ाइल के रूप में भी भेज दिया जाएगा। उन्हें अलग बताने का कोई तुच्छ तरीका नहीं है, सिवाय इसके कि एलआईबी जो डीएलएल के लिए आयात पुस्तकालय हैं, आमतौर पर मिलान स्थैतिक एलआईबी की तुलना में छोटे (अक्सर बहुत छोटे) होंगे।
यदि आप संयोग से जीसीसी टूलकिन का उपयोग करते हैं, तो आपको अपने DLL से मिलान करने के लिए वास्तव में आयात पुस्तकालयों की आवश्यकता नहीं है। विंडोज से पोर्ट किए गए ग्नू लिंकर का संस्करण डीएलएल को सीधे समझता है, और मक्खी पर किसी भी आवश्यक स्टब्स को संश्लेषित कर सकता है।
अपडेट करें
यदि आप सिर्फ यह जानने का विरोध नहीं कर सकते हैं कि सभी नट और बोल्ट वास्तव में कहां हैं और वास्तव में क्या चल रहा है, तो मदद करने के लिए MSDN पर हमेशा कुछ होता है। मैट Pietrek के लेख Win32 पोर्टेबल निष्पादन योग्य फ़ाइल प्रारूप में एक में गहराई देखो , EXE फ़ाइल के प्रारूप का बहुत पूरा अवलोकन है और यह कैसे लोड होता है और कैसे चलता है। यह भी .NET को कवर करने के लिए अद्यतन किया गया है और अधिक यह मूल रूप से MSDN मैगज़ीन ca में दिखाई दिया। 2002।
इसके अलावा, यह जानना उपयोगी हो सकता है कि किसी प्रोग्राम द्वारा DLL का सही उपयोग कैसे किया जाए। उस के लिए उपकरण निर्भरता वॉकर, उर्फ depend.exe है। इसका एक संस्करण विजुअल स्टूडियो के साथ शामिल है, लेकिन नवीनतम संस्करण इसके लेखक से http://www.dependencywalker.com/ पर उपलब्ध है । । यह उन सभी DLL की पहचान कर सकता है जो लिंक टाइम (शुरुआती लोड और विलंब लोड दोनों) में निर्दिष्ट थे और यह प्रोग्राम को भी चला सकता है और किसी भी अतिरिक्त DLL के लिए देख सकता है जो रन टाइम पर लोड होता है।
अपडेट २
मैंने पूर्व पाठ में से कुछ को फिर से पढ़ने पर स्पष्ट करने के लिए, और MSDN के साथ संगति के लिए कला निहित और स्पष्ट लिंकिंग की शर्तों का उपयोग करने के लिए पुन: तैयार किया है ।
इसलिए, हमारे पास तीन तरीके हैं जो लाइब्रेरी फ़ंक्शंस को प्रोग्राम द्वारा उपयोग किए जाने के लिए उपलब्ध करा सकते हैं। स्पष्ट अनुवर्ती प्रश्न तो यह है: "मैं कैसे रास्ता चुनूं?"
स्टेटिक लिंकिंग यह है कि प्रोग्राम के थोक को खुद से कैसे जोड़ा जाता है। आपकी सभी ऑब्जेक्ट फ़ाइलें सूचीबद्ध हैं, और लिंकर द्वारा EXE फ़ाइल में एक साथ एकत्र की जाती हैं। रास्ते के साथ, लिंकर मामूली प्रतीकों का ध्यान रखता है जैसे वैश्विक प्रतीकों के संदर्भों को ठीक करना ताकि आपके मॉड्यूल एक दूसरे के कार्यों को कॉल कर सकें। पुस्तकालयों को सांख्यिकीय रूप से भी जोड़ा जा सकता है। लायब्रेरी में बनाने वाली ऑब्जेक्ट फ़ाइलों को एक .LIB फ़ाइल में एक लाइब्रेरियन द्वारा एक साथ एकत्र किया जाता है जो लिंकर उन मॉड्यूल के लिए खोज करता है जिनमें आवश्यक प्रतीक होते हैं। स्थैतिक लिंकिंग का एक प्रभाव यह है कि लाइब्रेरी के केवल वे मॉड्यूल जो प्रोग्राम द्वारा उपयोग किए जाते हैं, उनसे जुड़े हुए हैं; अन्य मॉड्यूल की अनदेखी की जाती है। उदाहरण के लिए, पारंपरिक सी गणित पुस्तकालय में कई त्रिकोणमिति फ़ंक्शन शामिल हैं। लेकिन अगर आप इसके खिलाफ लिंक करते हैं और उपयोग करते हैंcos()
, आप कोड के लिए sin()
या tan()
जब तक आप भी उन कार्यों को बुलाया की एक प्रति के साथ समाप्त नहीं होता है। सुविधाओं के एक समृद्ध सेट के साथ बड़े पुस्तकालयों के लिए, मॉड्यूल का यह चयनात्मक समावेश महत्वपूर्ण है। कई प्लेटफार्मों जैसे कि एम्बेडेड सिस्टम, डिवाइस में एक निष्पादन योग्य स्टोर करने के लिए उपलब्ध स्थान की तुलना में लाइब्रेरी में उपयोग के लिए उपलब्ध कोड का कुल आकार बड़ा हो सकता है। चयनात्मक समावेशन के बिना, उन प्लेटफार्मों के निर्माण कार्यक्रमों के विवरण का प्रबंधन करना कठिन होगा।
हालाँकि, चल रहे हर प्रोग्राम में एक ही लाइब्रेरी की कॉपी होने से एक सिस्टम पर बोझ पड़ता है जो आम तौर पर बहुत सारी प्रक्रियाएँ चलाता है। सही प्रकार की वर्चुअल मेमोरी सिस्टम के साथ, मेमोरी के पृष्ठों में समान सामग्री की आवश्यकता होती है जो केवल एक बार सिस्टम में मौजूद होती हैं, लेकिन कई प्रक्रियाओं द्वारा उपयोग की जा सकती हैं। यह उन अवसरों को बढ़ाने के लिए एक लाभ पैदा करता है जिनमें कोड वाले पृष्ठ संभव के रूप में कई अन्य चल रही प्रक्रियाओं में कुछ पेज के समान होने की संभावना है। लेकिन, अगर प्रोग्राम स्टैटिस्टिकल रनटाइम लाइब्रेरी से लिंक करते हैं, तो प्रत्येक में फ़ंक्शंस का एक अलग मिश्रण होता है, जो प्रत्येक प्रक्रिया को अलग-अलग स्थानों पर मेमोरी मैप करता है, और जब तक कि यह एक प्रोग्राम नहीं होता है, तब तक कई सारे कोडेबल पेज नहीं होते हैं। प्रक्रिया से अधिक में चलाते हैं। तो एक DLL के विचार ने एक और, प्रमुख, लाभ प्राप्त किया।
किसी लाइब्रेरी के लिए DLL में उसके सभी कार्य होते हैं, जो किसी भी क्लाइंट प्रोग्राम द्वारा उपयोग के लिए तैयार हैं। यदि कई प्रोग्राम उस DLL को लोड करते हैं, तो वे सभी इसके कोड पेज साझा कर सकते हैं। हर कोई जीतता है। (ठीक है, जब तक कि आप नए संस्करण के साथ एक DLL अपडेट नहीं करते हैं, लेकिन यह इस कहानी का हिस्सा नहीं है। कहानी के उस पक्ष के लिए Google DLL नर्क।)
इसलिए नई परियोजना की योजना बनाते समय पहली बड़ी पसंद गतिशील और स्थिर संबंध के बीच है। स्टैटिक लिंकेज के साथ, आपके पास इंस्टॉल करने के लिए बहुत कम फाइलें होती हैं, और आपके द्वारा उपयोग किए जा रहे DLL को अपडेट करने वाले थर्ड पार्टी से आप इम्यून होते हैं। हालाँकि, आपका प्रोग्राम बड़ा है, और यह विंडोज इकोसिस्टम के अच्छे नागरिक के रूप में नहीं है। डायनेमिक लिंकेज के साथ, आपके पास इंस्टॉल करने के लिए अधिक फाइलें हैं, आपके पास आपके द्वारा उपयोग किए जा रहे डीएलएल को अपडेट करने वाली तीसरी पार्टी के साथ समस्या हो सकती है, लेकिन आप आमतौर पर सिस्टम पर अन्य प्रक्रियाओं के लिए मित्रवत होते हैं।
एक DLL का एक बड़ा फायदा यह है कि इसे पुनः लोड किए बिना या मुख्य प्रोग्राम को रिलैक्स किए बिना भी लोड और उपयोग किया जा सकता है। यह एक तीसरे पक्ष के पुस्तकालय प्रदाता (उदाहरण के लिए, माइक्रोसॉफ्ट और सी रनटाइम को लगता है) को अपने पुस्तकालय में एक बग को ठीक करने और इसे वितरित करने की अनुमति दे सकता है। एक बार एक अंतिम उपयोगकर्ता अपडेट किए गए DLL को स्थापित करने के बाद, वे तुरंत उस DLL का उपयोग करने वाले सभी कार्यक्रमों में उस बग फिक्स का लाभ प्राप्त करते हैं। (जब तक कि यह चीजों को तोड़ न दे। DLL नर्क देखें।)
अन्य लाभ अंतर्निहित और स्पष्ट लोडिंग के बीच अंतर से आता है। यदि आप स्पष्ट लोडिंग के अतिरिक्त प्रयास पर जाते हैं, तो प्रोग्राम के लिखे जाने और प्रकाशित होने पर DLL भी मौजूद नहीं हो सकता है। यह विस्तार तंत्र के लिए अनुमति देता है जो प्लगइन्स को खोज और लोड कर सकता है, उदाहरण के लिए।
lib /list xxx.lib
औरlink /dump /linkermember xxx.lib
। यह स्टैक ओवरफ्लो प्रश्न देखें ।