2012-06-15 15 views
10

चलाने के लिए डीएल की आवश्यकता है ऐसी चीजें हैं जिन्हें मैं समझने की बात नहीं करता हूं ... मैं एक तृतीय पक्ष लाइब्रेरी (जीईओएस लाइब्रेरी) का उपयोग कर एक प्रोग्राम लिख रहा हूं। इस कार्यक्रम में geos.lib की निर्भरता है लेकिन अभी भी चलाने के लिए geos.dll की आवश्यकता है।प्रोग्राम एक लाइब्रेरी से स्थिर रूप से जुड़ा हुआ है लेकिन अभी भी

मैंने this question पढ़ा, मुझे लगता है कि मैं स्थिर और गतिशील पुस्तकालयों के बीच अंतर को समझता हूं। जो मुझे समझ में नहीं आता है, जब मैं एक पुस्तकालय को स्थिर रूप से लिंक करता हूं तो मुझे अभी भी एक डीएल की आवश्यकता क्यों होती है।

उत्तर

16

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

+0

क्या कोई विकल्प नहीं है जो विशेष रूप से .dll फ़ाइल से कोड को लिंक करने की अनुमति देता है? –

+1

मुझे लगता है कि आपको स्थिर लिंकिंग के लिए लाइब्रेरी को संकलित करना है, मुझे यकीन नहीं है कि संकलित होने के बाद आप एक स्थिर रूप से लिंक्ड लाइब्रेरी में एक डीएल बदल सकते हैं। –

+0

@Andrew तो dll फ़ाइलें हमेशा एक .lib के साथ आती हैं? मुझे कैसे पता चलेगा कि .lib पर्याप्त नहीं है और मुझे डीएल प्रदान करने की आवश्यकता है? – undu

0

आप निश्चित रूप से गतिशील लाइब्रेरी से लिंक कर रहे हैं। सिर्फ इसलिए कि लिंकर की आवश्यकता है। Lib फ़ाइल का मतलब यह नहीं है कि आप एक स्थिर पुस्तकालय से जुड़ रहे हैं।

0

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

18

विंडोज पर लाइब्रेरी के 3 प्रकार हैं:

  • वस्तु पुस्तकालय (* उदारीकरण)
  • आयात पुस्तकालय (* उदारीकरण)
  • गतिशील पुस्तकालय (* .dll)

ऑब्जेक्ट लाइब्रेरी स्थिर रूप से जुड़े हुए हैं। उनमें पुस्तकालय द्वारा संक्षेप में कोड की पूर्ण वस्तु परिभाषाएं होती हैं।

आयात पुस्तकालय ऑब्जेक्ट लाइब्रेरी का एक विशेष रूप है। कोड रखने के बजाय उनमें लिंकर के लिए जानकारी होती है जो आखिरकार निष्पादन योग्य फ़ाइल को डायनामिक-लिंक लाइब्रेरी में मैप करती है।

डायनामिक लिंक लाइब्रेरीज़, ऑब्जेक्ट लाइब्रेरीज़, आपके प्रोग्राम के लिए सप्लाई कोड। हालांकि, यह कोड रनटाइम पर लोड किया गया है और आपके exe में संकलित नहीं है।

आपको हमेशा एक आयात लाइब्रेरी को लिंक करने की आवश्यकता नहीं है। इसके बजाय आप LoadLibrary() को कॉल कर सकते हैं और एपीआई एंट्री पॉइंट्स को नाम या ऑर्डिनल से देख सकते हैं। (आपको हमेशा उस कोड को बताना होगा जो डीएलएल और उस डीएलएल के एपीआई में आप दर्ज करना चाहते हैं।)

अन्य टिप्पणियां यहां सही हैं कि आप एक डीएलएल को स्थिर के लिए कोड को दोबारा बनाने के बिना एक स्थिर lib में नहीं बना सकते - यह एक अलग तरह का उत्पादन है।

+4

[शुरुआती गाइड टू लिंकर्स] (http://www.lurklurk.org/linkers /linkers.html) लिंक करने के बारे में एक महान लेख है। इस सप्ताह एक ही सवाल पर शोध करते हुए मैंने इसे पाया। – Pressacco

1

यदि .lib विजुअल स्टूडियो द्वारा बनाया गया था तो परियोजना गुणों -> लिंकर -> इनपुट -> मॉड्यूल परिभाषा फ़ाइल का मूल्य जांचें। यदि यह खाली नहीं है तो link.exe स्थिर लाइब्रेरी की बजाय स्टब लाइब्रेरी बनाएं, भले ही प्रोजेक्ट गुण -> सामान्य -> ​​कॉन्फ़िगरेशन प्रकार "स्टेटिक लाइब्रेरी (.lib)" है।

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