2009-12-03 14 views
5

मुझे वास्तव में अस्पष्ट समस्या है, लेकिन मुझे उम्मीद है कि कोई इसके साथ मदद कर सकता है। मैं एक सी ++ परियोजना को संशोधित कर रहा था और कल यह अभी भी काम कर रहा था, लेकिन आज यह नहीं है। मुझे पूरा यकीन है कि मैंने कुछ भी नहीं बदला है, लेकिन पूरी तरह से सुनिश्चित करने के लिए मैंने फिर से एसवीएन से परियोजना की जांच की और मैं भी पिछले सिस्टम पुनर्स्थापना बिंदु पर वापस लौट आया (क्योंकि यह एक काम कंप्यूटर है, कभी-कभी गुप्त रूप से अपडेट इंस्टॉल करता है।)। सफलतापूर्वक इसे संकलित करने के बाद, प्रोग्राम शुरू हो सकता है, लेकिन जब मैं इसके साथ बातचीत करता हूं, तो मुझे यह त्रुटि मिलती है: प्रक्रिया प्रविष्टि बिंदु? MethodName @ className @@ UAEXXZ गतिशील लिंक लाइब्रेरी libName.dll में स्थित नहीं हो सका।जब मैं निश्चित रूप से इसे डालता हूं तो "प्रक्रिया प्रविष्टि बिंदु डीएल में स्थित नहीं हो सकता"?

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

मूल रूप से मुझे डीएलएल, लिंकिंग इत्यादि के बारे में कुछ भी पता नहीं है, इसलिए अगर किसी के पास कोई विचार है कि परियोजना में बहुत स्पष्ट रूप से परिभाषित किए गए कार्यों को अचानक क्यों नहीं बनाया जाता है तो मैं इसकी बहुत सराहना करता हूं अब डीएलएल में। मुझे पता है कि यह अस्पष्ट है और यदि कोई और जानकारी जरूरी है तो मैं खुशी से इसे प्रदान करूंगा। धन्यवाद!

अद्यतन: मैंने दिए गए सुझावों का प्रयास किया है, लेकिन मैं अभी भी अटक गया हूं। __declspec(dllexport) स्पष्ट रूप से पूरे प्रोजेक्ट में उपयोग नहीं किया जाता है। निर्भरता वाकर के साथ डीएलएल खोलना मुझे एक खाली शीर्ष दायां अनुभाग दिखाता है और नीचे दिया गया अनुभाग त्रुटि संदेश से फ़ंक्शन को सूचीबद्ध करता है। अगर मैं Undecorate सी ++ कार्य जाँच यह ठीक लग रहा है, लेकिन मैं त्रुटि संदेश से अजीब प्रश्न चिह्न और @s प्राप्त करता है, तो मुझे नहीं पता है और वहाँ अंत में एक अंतर हो गया लगता है:

[email protected]@@UAEXXZ 
[email protected]@@[email protected] 

शायद यह समस्या है, लेकिन मुझे नहीं पता कि इसका क्या अर्थ है, इसके कारण क्या हो सकता है और मैं इसके बारे में क्या कर सकता हूं।

+0

क्या आपने वीसी ++ कंपाइलर विकल्पों में/वॉल जोड़ने की कोशिश की है? एक संकेत दे सकता है ... – Romain

उत्तर

1

मुझे थोड़ा बेवकूफ लगता है, लेकिन मुझे जवाब मिला। आवेदन (exe) मैं स्पष्ट रूप से एक दूसरा, अलग डीएल लोड कर रहा था जिसकी मेरी मूल पोस्ट में उल्लिखित एक पर निर्भरता थी। यह दूसरा डीएल अभी भी पुराने कार्यों की उम्मीद कर रहा था और अद्यतन डीएल के खिलाफ भी पुनः संयोजित करने की आवश्यकता थी।

उन लोगों के लिए बहुत धन्यवाद जिन्होंने यहां मेरी मदद करने की कोशिश की!

8

क्या आप वास्तव में __declspec(dllexport) का उपयोग कर रहे हैं? मेरा अनुमान नहीं है - उस घोषणा के बिना, वह फ़ंक्शन डीएलएल द्वारा निर्यात नहीं किया जाएगा (या दूसरे शब्दों में, प्रोग्राम लोड हो रहा है कि डीएलएल को उस घोषणा के बिना कार्यों तक पहुंच नहीं होगी)।

इसके अलावा, यह देखने के लिए कि आपके डीएलएल ने कौन सी फ़ंक्शंस उपलब्ध कराई है, Dependency Walker का उपयोग करने का प्रयास करें।


तथ्य यह है कि __declspec(dllexport) समारोह घोषणाओं में नहीं किया जाता है ठीक है - समय की सबसे, यह केवल एक बार एक भी हेडर फाइल में, जैसे

#ifdef MAKING_DLL 
#define FOO_API __declspec(dllexport) 
#else 
#define FOO_API 
#endif 

तो यह है कि अगर उपयोग किया जाएगा आपके पास उस अनुभाग से पहले #define MAKING_DLL है, FOO_API int BakeACake() जैसे सभी फ़ंक्शंस घोषित किए गए हैं, इस पर आधारित किया जाएगा कि MAKING_DLL परिभाषित किया गया था या नहीं। यह संभव है कि परियोजना MAKING_DLL (या इसके समतुल्य) को प्रोजेक्ट प्रकार के आधार पर कमांड लाइन पर परिभाषित किया जा सके (/DMAKING_DLL जैसे कुछ; या आपको /DFOO_API=__declspec(dllexport) जैसे FOO_API को परिभाषित करने की भी आवश्यकता हो सकती है।

निर्भरता वॉकर में खाली शीर्ष दायां अनुभाग का मतलब है कि आपका प्रोग्राम DLL की संबंधित .lib फ़ाइल के विरुद्ध लिंक नहीं कर रहा है। ठीक है, इसका मतलब है कि आप DLL में फ़ंक्शंस तक पहुंचने के लिए LoadLibrary या LoadLibraryEx का उपयोग कर रहे हैं।

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

+0

आपके उत्तर के लिए धन्यवाद! मैंने आपके सुझावों को देखने का प्रयास किया है, लेकिन मैं अभी भी अटक गया हूं (मेरे प्रश्न के अपडेट को देखें)। यदि आपके पास और सुझाव हैं, तो यह बहुत अच्छा होगा! – Jordi

2

dependency walker डाउनलोड करें और इस टूल का उपयोग करके अपना डीएल खोलें। यह आपके डीएल से निर्यात किए गए कार्यों की एक सूची दिखाएगा। जांचें कि उपर्युक्त विधि अपेक्षित कार्यों का हिस्सा है या नहीं। यदि ऐसा नहीं है, तो इसका मतलब है कि आपने उस डेल में कक्षाओं में से किसी एक के लिए गलती से __declspec(dllexport) हटा दिया है।

+0

आपका उत्तर आपके ऊपर पोस्टर जैसा ही प्रतीत होता है, लेकिन वैसे भी धन्यवाद! मैंने सुझावों की कोशिश की, लेकिन मैं अभी भी अटक गया हूं (मेरे प्रश्न के अपडेट को देखें)। मैं और मदद के लिए आभारी होंगे! – Jordi

+0

@ जोर्डी: पहली समस्या यह है कि इस समस्या का सामना करते समय लोग क्या करेंगे। मुझे लगता है कि हमने एक साथ टाइप करना शुरू कर दिया है और वह मेरे सामने पूरा हुआ है। – Ponting

0

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

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

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