2008-10-26 4 views
18

9 0 के दशक में जब मैंने पहली बार एमएफसी के साथ शुरुआत की, तो मैं अपने ऐप्स को गतिशील रूप से लिंक करता था और प्रासंगिक एमएफसी डीएलएल भेजता था। इसने मुझे कुछ मुद्दों (डीएलएल नरक!) का कारण बना दिया और मैं इसके बजाय स्थिर रूप से लिंक करने के लिए स्विच किया - न सिर्फ एमएफसी के लिए, बल्कि सीआरटी और एटीएल के लिए। बड़ी EXE फ़ाइलों के अलावा, स्थिर रूप से लिंक करने से मुझे कभी भी कोई समस्या नहीं हुई है - ऐसे में क्या कोई अन्य डाउनसाइड्स है जो अन्य लोगों ने पार किया है? क्या डायनामिक लिंकिंग को दोबारा संशोधित करने का कोई अच्छा कारण है? मेरे ऐप्स मुख्य रूप से एसटीएल/बूस्ट आजकल एफडब्ल्यूआईडब्ल्यू हैं।सीआरटी, एमएफसी, एटीएल, इत्यादि को स्थिर या गतिशील लिंक

उत्तर

17

कुछ कमियां हैं:

  • बड़ा exe आकार (खासकर तब जब आप एकाधिक exe के जहाज)
  • समस्याएं अन्य DLL की है जिस पर भरोसा करते हैं या गतिशील जोड़ने मान का उपयोग कर (जैसे: 3 पार्टी DLL मान लीजिए कि आप नहीं मिल सकता है जो के रूप में स्थिर पुस्तकालयों)
  • अलग स्वतंत्र स्थिर लिंकेज (कोई पार मॉड्यूल आवंटित/पुनःआवंटन)
  • साझा घटकों के कोई स्वत: सर्विसिंग (3 पार्टी मॉड्यूल आपूर्तिकर्ता समस्याओं को ठीक करने को अपना कोड अपडेट करने के लिए कोई क्षमता के साथ DLL के बीच सी runtimes बिना recomp के iling और अद्यतन करने के लिए आपके आवेदन)

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

+0

http://stackoverflow.com/questions/787216 – Weidenrinde

1

नहीं, उस मोर्चे पर कुछ भी नया नहीं है। इसे उस रास्ते से रखें।

1

सबसे निश्चित रूप से।

आवंटन 'स्थैतिक' ढेर पर किया जाता है। चूंकि आवंटन एक ही ढेर पर एक डीलोकेशन किया जाना चाहिए, इसका मतलब है कि यदि आप एक पुस्तकालय भेजते हैं, तो आपको ध्यान रखना चाहिए कि ग्राहक कोड 'आपका' p = new LibClass() पर कॉल नहीं कर सकता है और delete p; का उपयोग करके उस ऑब्जेक्ट को स्वयं हटा सकता है।

मेरा निष्कर्ष: या तो क्लाइंट कोड से ढाल आवंटन और हटाने से, या गतिशील रूप से सीआरटी को लिंक करें।

4

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

दुर्भाग्यवश, कुछ पुस्तकालय हैं जिन्हें आप स्थिर रूप से लिंक नहीं कर सकते हैं। मेरे पास सबसे अच्छा उदाहरण ओपनएमपी है। यदि आप विजुअल स्टूडियो के ओपनएमपी समर्थन का लाभ उठाते हैं, तो आपको यह सुनिश्चित करना होगा कि रनटाइम स्थापित है (इस मामले में vcomp.dll)।

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

उसने कहा, मैं अभी भी स्थिर रूप से अपने exe और dll को लिंक करता हूं। यह इंस्टॉल में बहुत विविधता को कम करता है और मैं मानता हूं कि कुछ सीमाओं के लायक है।

+1

स्मृति आवंटन के बारे में बात सही नहीं है। जब आप डीएलएल सीआरटी का उपयोग करते हैं, तो ऐप में केवल एक सीआरटी मौजूद होता है ताकि आप एक डीएलएल से आवंटित हो सकें और दूसरे में डिलीकेट कर सकें, यह सब एक ही ढेर पर जा रहा है क्योंकि यह एक ही सीआरटी है। –

+0

सच है, लेकिन यदि exe और dll दोनों स्थिर रूप से जुड़े हैं तो दो ढेर हैं। सही? कम से कम यह मेरा अनुभव है। मुझे आपको बताना होगा, एक std :: स्ट्रिंग को आगे और आगे पास करने में सक्षम होने के कारण या एक वेक्टर ने मेरी ज़िंदगी को और अधिक आसान बना दिया होगा। –

+2

std :: स्ट्रिंग समस्या का समाधान waffling नहीं है। या तो स्थिर रूप से लिंक या गतिशील रूप से लिंक। यदि आपने कम से कम एक सी ++ डीएलएल खाया है, तो सीआरटी डीएलएल के खिलाफ लिंक करें। – MSalters

2

डीएलएल का उपयोग करने की एक अच्छी सुविधा यह है कि यदि एकाधिक प्रक्रिया एक ही डीएलएल लोड करती है तो उसका कोड उनके बीच साझा किया जा सकता है। यह किसी अन्य प्रोग्राम द्वारा पहले से उपयोग किए जाने वाले डीएल लोड करने वाले एप्लिकेशन के लिए स्मृति को सहेज सकता है और लोडिंग समय को छोटा कर सकता है।

+2

जो पृष्ठ deduplication द्वारा सिस्टम मेमोरी को सहेज सकता है, लेकिन व्यक्तिगत प्रक्रिया वर्चुअल एड्रेस स्पेस वास्तव में कम हो जाती है - लाइब्रेरी के केवल हिस्सों के बजाय निष्पादन योग्य में खींचने के बजाय आपके पास प्रक्रिया पता स्थान पर मैप की पूरी लाइब्रेरी है। कई डीएलएल मैप किए गए और एएसएलआर के साथ, प्रक्रिया वर्चुअल एड्रेस स्पेस खंडित हो जाती है जो कम से कम 32-बिट अनुप्रयोगों के लिए काफी मेमोरी ब्लॉक के आकार को कम कर देता है जिसे आवंटित किया जा सकता है। –

18

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

सचमुच मैं उन लोगों को डाउनसाइड्स मानता हूं, ऊपर नहीं। जब कोई तृतीय पक्ष डीएल अपडेट किया जाता है, तो यह आपके सॉफ़्टवेयर को तोड़ने के लिए पर्याप्त रूप से बदल सकता है। और इन दिनों, हार्ड ड्राइव स्पेस उतनी ही मूल्यवान नहीं है जितनी एक बार थी, आपके निष्पादन योग्य में एक अतिरिक्त 500k? किसे पड़ी है?

  • आपके सॉफ़्टवेयर का उपयोग करने वाले डीएलएल के संस्करण के 100% निश्चित होने के नाते एक अच्छी बात है।
  • 100% सुनिश्चित होने के नाते कि ग्राहक पर निर्भरता सिरदर्द नहीं होने वाला एक अच्छी बात है।

तेजी दूर मेरी राय में कमियां पल्ला झुकना

1

आवश्यकता है कि आप या तो एक DLL का उपयोग करें या वस्तु फ़ाइलों है कि उपयोगकर्ता एक साथ लिंक कर सकते हैं के रूप में अपने आवेदन वितरित करने के लिए इस तरह के LGPL के रूप में कुछ सॉफ्टवेयर लाइसेंस हैं। यदि आप ऐसी लाइब्रेरी का उपयोग कर रहे हैं, तो आप शायद इसे डीएलएल के रूप में उपयोग करना चाहेंगे।

+0

में संभावित रूप से बेहतर दृष्टिकोण (निजी असेंबली) का वर्णन किया गया है यदि आप ऐसी लाइब्रेरी का उपयोग करने के लिए _have_ करते हैं, तो आप स्थिर लिंक के लिए एक रौती का भुगतान कर सकते हैं (डीएलएल के आसपास लूग करने के बजाए)। – Navin

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

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