मैं "लापता DLL" समस्याओं से कैसे छुटकारा पा सकता हूं?


15

मैंने विजुअल C ++ 2015 और ओपनजीएल के साथ कुछ गेम बनाए। जब मैंने इसे अपनी मशीन पर चलाया तो कोई समस्या नहीं थी, लेकिन जब मैंने इसे अन्य मशीनों पर चलाया तो पता चलता है कि कुछ DLL गायब हैं। मैं यह जानना चाहता हूं कि यह कैसे सुनिश्चित किया जाए कि यह अगली बार न हो और मुझे किन चीजों पर विचार करना चाहिए ताकि मैं फाइल गुम समस्याओं से बच सकूं?


8
पहले, सुनिश्चित करें कि आप एक रिलीज़ संस्करण बना रहे हैं।
user253751

3
आप होना चाहते हैं बिल्कुल यकीन है कि वहाँ वी.एस. से ही कोई निर्भरता हैं - लेकिन यह अपने आप ही दोष यह है के साथ आता है - कोड पीढ़ी सेटिंग्स में आप मीट्रिक टन के बजाय बहु लड़ी पिरोया / बहु लड़ी पिरोया डीबग (डिबग बनाता है के लिए) के साथ जाने के लिए चुन सकते हैं DLL / एमटी डीबग डीएलएल । यह आपके निष्पादन योग्य आकार को बढ़ाता है और इस तरह संकलित आपका बाइनरी रनटाइम डीएलएस अपडेट से लाभान्वित नहीं होगा। लेकिन यह आप पर निर्भर है। प्लस पक्ष यह है कि आपके निष्पादन योग्य में "बाहरी" निर्भरता नहीं होगी। मैं इसे उत्तर के रूप में पोस्ट नहीं करूंगा क्योंकि यह आपकी समस्या का समाधान नहीं है, बस एक समाधान है।
Gizmo

@Gizmo एक वर्कअराउंड अभी भी एक उत्तर है और टिप्पणियां अस्थायी हैं और उनका उपयोग उन पोस्ट को स्पष्ट करने के लिए किया जाता है, जिन्हें हटाया जा सकता है। इसलिए यदि यह उपयोगी है, तो आपको इसे उत्तर के रूप में पोस्ट करना चाहिए।
user1306322

हम्म ठीक है। मैं इसे उत्तर के रूप में पोस्ट करूँगा।
Gizmo

जवाबों:


22

आपको Visual Studio के संस्करण के लिए पुनर्वितरण स्थापित करने की आवश्यकता है जिसे आप किसी भी मशीन पर उपयोग करते हैं जो कि निष्पादनयोग्य को चलाना चाहता है, जैसे https://www.microsoft.com/en-us/download/details.aspx?id=48145 VS2015 के लिए । आपको डायरेक्टएक्स या अन्य घटकों के लिए रिडिस्ट की भी आवश्यकता हो सकती है।

एप्लिकेशन के इंस्टॉलर आमतौर पर किसी भी निर्भरता के लिए सभी पुनर्वितरण स्थापित करते हैं। आप इस तरह के इंस्टॉलर को इनसोसेट, एनएसआईएस, आगंतुक या अन्य विभिन्न उपकरणों के साथ बना सकते हैं।

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


क्या इस तरह के इंस्टॉलर के निर्माण के लिए वीएस का उपयोग करना संभव है? मुझे लगा कि मैंने एक बार प्रोजेक्ट सेटिंग्स में OneClick नामक कुछ देखा है।
user1306322

@ user1306322: बिल्कुल, एक समाधान का उल्लेख Gizmo द्वारा प्रश्न की टिप्पणियों में किया गया था। यह सिर्फ एक बात है कि आप किस रनटाइम / डीएलएल के खिलाफ लिंक करते हैं। डिफ़ॉल्ट सेटिंग में आपके पास संस्करण-विशिष्ट CRT DLL के खिलाफ लिंकिंग है, लेकिन इसे लिंकर विकल्पों में mucking द्वारा बदला जा सकता है। केवल MSVCRT.DLL(विंडोज के साथ शामिल) के खिलाफ लिंक ( MSVCPxxx.DLLदृश्य स्टूडियो रिलीज के साथ शामिल संस्करण-विशिष्ट संस्करण)।
सीन मिडलिचच

या यदि आप एक पूर्ण इंस्टॉलर का निर्माण करते हैं, तो यह मूल रूप से आगंतुक है है। यह एक सामान्य अति-जटिल XML-भारी Microsoft बकवास है, लेकिन यह काम करता है। वहाँ भी "इंस्टॉलर प्रोजेक्ट्स" हुआ करते थे, हालांकि मेरा मानना ​​है कि वे 2013 या 2015 से चले गए हैं
शॉन मिडिल्डिच

7

लापता DLL को ट्रैक करने के लिए मैं डिपेंडेंसी वॉकर का उपयोग करता हूं :

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


डीएसएल के सांख्यिकीय रूप से लिंक करने के लिए वीएस में एक संकलन-समय विकल्प भी है :

  • स्टैटिकली लिंकिंग का मतलब है कि DLL EXE फाइल में शामिल है।
  • स्टैटिकली लिंकिंग से EXE फ़ाइल का आकार बढ़ जाता है।
  • स्टैटिकली लिंकिंग का अर्थ है कि DLL का यह संस्करण हमेशा उपयोग किया जाएगा।
  • हालाँकि, स्टैटिकली लिंकिंग का मतलब यह भी है कि आपको लापता DLL की समस्या कभी नहीं होगी।

1
डिपेंडेंसी वॉकर काफी पुराना है। यह अब DLL को लोड करने के लिए विंडोज के तंत्र का ठीक से अनुकरण नहीं करता है। अक्सर DLLs खोजने में असमर्थ होने के बारे में फर्जी संदेशों के लिए अग्रणी।
jpmc26

और एक निर्भरता के लाइसेंस में स्टेटिक लिंकिंग की मनाही हो सकती है।
KeyWeeUsr

6

विज़ुअल सी ++ के लिए, आपके पास कुछ विकल्प हैं कि पुनर्वितरण को कैसे संभालें: अपने इंस्टॉलर (व्यवस्थापक अधिकारों के साथ) से एक एक्सई चलाएं, अपने एमएसआई इंस्टॉलर के साथ एक एमएसएम मर्ज मॉड्यूल का उपयोग करें, या साइड-बाय-साइड डीएलएल भी। विवरण के लिए MSDN देखें ।

बड़ा मुद्दा ओपनजीएल है। OpenGL का एकमात्र संस्करण जो Windows के साथ शामिल है, एक OpenGL 1.5 सॉफ्टवेयर रेंडरर है। किसी भी चीज के लिए थर्ड पार्टी आईसीडी की आवश्यकता होती है।

यह एक कारण है कि ऑपरेटिंग सिस्टम के साथ शामिल किए जाने के बाद से कई विंडोज गेम्स डायरेक्टएक्स का उपयोग करते हैं। डायरेक्ट 3 डी 11 गेम डेवलपर्स के लिए तैनाती और प्रत्यक्ष सेटअप नहीं देखें ।


1
OpenGL सलाह पुरानी है - हर आधुनिक ग्राफिक्स ड्राइवर एक अप-टू-डेट OpenGL ICD के साथ आता है।
user253751

Ive को व्यक्तिगत रूप से मशीनों पर एक साल की उम्र में ओपन डीएलएल स्थापित करना था
Gnemlock

@Gnemlock ने कहा कि पुराने कंप्यूटर पर विंडोज को पुनः स्थापित करने के तुरंत बाद, आप सही हो सकते हैं। क्या आपने NVIDIA, AMD, या Intel के आधिकारिक ड्राइवर पैकेज को स्थापित करने के बाद इस समस्या को देखना जारी रखा है?
दामियन येरिक

2
@Gnemlock - यदि आप मैन्युअल रूप से OpenGL DLL स्थापित कर रहे हैं तो आप कुछ भयावह गलत कर रहे हैं। यदि आप वास्तव में "अपने जीपीयू विक्रेता के ड्राइवर को स्थापित करते हैं" का मतलब है, तो यह वही है जो अभी भी कहा जाता है।
मैक्सिमस मिनिमस

@Gnemlock - आह, तो असली दुनिया के लिए प्रासंगिक नहीं है। इसे साफ करने के लिए धन्यवाद।
मैक्सिमस मिनिमस

1

डिस्क्लेमर: यह वर्कअराउंड है , ए नहीं कि आपके उत्तर का हल है, लेकिन फिर भी, बहुत व्यवहार्य संभावना है।

यदि आप पूरी तरह से सुनिश्चित करना चाहते हैं कि वीएस से कोई निर्भरता नहीं है - लेकिन यह अपनी कमियों के साथ आता है - कोड जनरेशन सेटिंग्स में आप मल्टी थ्रेडेड (MT) / मल्टी थ्रेडेड डिबग (MD) के साथ जाना चुन सकते हैं (डीबग बड्स के लिए) ) एमटी डीएलएल (एमटीडी) / एमटी डीबग डीएलएल (एमडीडी) के बजाय।

यहाँ छवि विवरण दर्ज करें

क्या कमियां हैं?

  • यह आपके निष्पादन योग्य आकार और आपके बाइनरी को बढ़ाता है (हालांकि यदि आप एक गेम बना रहे हैं तो यह शायद नगण्य है)
  • इस तरह संकलित रनटाइम डीएलएस अपडेट से लाभ नहीं होगा। (उदाहरण यदि Microsoft VC ++ 2015 SP2, SP3, SP4 आदि को जारी करता है।) लेकिन यह आपके ऊपर है।
  • अधिक RAM उपयोग (नगण्य भी) क्योंकि आप मौजूदा / लोडेड कोड (DLL) का फिर से उपयोग नहीं करते हैं
  • आपको यह सुनिश्चित करने की आवश्यकता है कि आपके द्वारा लिंक किए गए सभी पुस्तकालयों को एक ही रनटाइम के खिलाफ संकलित किया गया है, अन्यथा लिंकिंग विफल हो सकती है, या दिलचस्प रनटाइम त्रुटियां हो सकती हैं (शायद नहीं, लेकिन यह मेरे साथ जीवनकाल में एक बार एक विरासत परियोजना में हुआ था जिसे अद्यतन किया गया है नवीनतम VS)

और पेशेवरों क्या हैं?

  • आपके निष्पादन योग्य में वीएस से ही "बाहरी" निर्भरता नहीं होगी (कोई msvc * .dll आवश्यकता नहीं)।
  • कुछ लोग इसे प्रदर्शन में वृद्धि के रूप में देखते हैं क्योंकि आप डीएलएल कॉल ओवरहेड को समाप्त कर रहे हैं, जबकि यह सैद्धांतिक रूप से सच है, व्यवहार में सुधार नगण्य हैं

चेक इस लिंकअधिक विस्तृत विवरण के लिए और गड्ढे के लिए करें- और एक स्थैतिक रनटाइम का उपयोग करके आपके साथ आने वाली खराबी।

एक और वर्कअराउंड सभी आवश्यक DLL को रखना होगा जहां आपका बाइनरी है। आपके एप्लिकेशन को अपडेट (रनटाइम लाइब्रेरीज़) से लाभ नहीं होगा, लेकिन ऐसा है।

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

यह भी सुनिश्चित करें कि उपयोगकर्ता को यह पता होना चाहिए कि उसे संभवतः अपने GPU ड्राइवरों को अपडेट करने की आवश्यकता है (जैसे कि कई अनुप्रयोगों के लिए कई रनटाइम होते हैं, जैसे OpenGL, Vulcan)।


0

मेरा समाधान उस DLL को कॉपी और पेस्ट करना था, जो उस फ़ोल्डर में त्रुटि का कारण था जहाँ .sln फ़ाइल विज़ुअल स्टूडियो में स्थित है। #includeअनुभाग के बाद , मैंने #pragma comment (lib, "lost DLL name with .dll")इसे लिखा और हल किया!

नोट: मैंने उस समस्या को हल किया जो मुझे थर्ड पार्टी लाइब्रेरी (वल्कन एपी) डीएलएल के साथ सामना करना पड़ा। शायद यह ज्ञात नहीं है लेकिन 90% अच्छी किस्मत काम करेंगे :)

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