लिंक मुद्दे (वीसी 6)

मैंने एक पुराने वर्कस्पेस खोला है जो लाइबेरे और इसकी टेस्ट दोहन है। यह ठीक काम करता था लेकिन अब कोड के पुराने संस्करण पुराने त्रुटियों के साथ काम नहीं करते हैं। मैंने प्रोजेक्ट को दोबारा बनाने की कोशिश की है और यह भी वही त्रुटियों का कारण बनता है। प्रोजेक्ट सेटिंग्स में ऑर्डर से कुछ भी नहीं लगता है और मुख्य ऐप में कोड जेनरेट काम करता है।

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

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

कोड जो IOCompletionPort.obj में समस्या के रूप में सूचीबद्ध है, वास्तव में std :: string का उपयोग नहीं करता है, लेकिन एक वर्ग को कॉल करता है जो करता है: comms :: अपवाद एक std :: string और GetLastError या WSAGetLastError का मान स्वीकार करता है।

त्रुटि में वर्णित फ़ंक्शन ( GetMessage ) लागू किया गया है, लेकिन एक वर्चुअल फ़ंक्शन है, इसलिए यदि आवश्यक हो तो अन्य कक्षाएं इसे ओवरराइड कर सकती हैं। हालांकि ऐसा लगता है कि कंपाइलर ने इसे एक Ansi संस्करण के रूप में बनाया है, लेकिन मुझे सेटिंग्स में कोई विकल्प नहीं मिल रहा है जो इसे नियंत्रित करेगा। मुझे संदेह है कि समस्या हो सकती है लेकिन लाइब्रेरी के विकल्पों के रास्ते में बहुत कम है क्योंकि मेरे पास निश्चित रूप से जानने का कोई तरीका नहीं है। हालांकि कंपाइलर विकल्पों में _एमबीसीएस निर्दिष्ट करने के लिए दोनों परियोजनाएं।

--------------------Configuration: TestComms - Win32 Debug-------------------- Linking... Comms.lib(IOCompletionPort.obj) : error LNK2001: unresolved external symbol "public: virtual class std::basic_string,class std::allocator > __thiscall Comms::Exception::GetMessageA(void)const " ([email protected] [email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ) Debug/TestComms.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.

TestComms.exe - 2 error(s), 0 warning(s)

कोई सुझाव? मैंने इसे सुबह सुबह खो दिया है और ज्यादातर दोपहर भी खोना नहीं चाहता हूं।

0
ro fr bn

5 उत्तर

windows.h को IOCompletionPort.h के शीर्ष पर घोषित किया गया है - मैं केवल 1 फ़ाइल को शामिल करने के लिए 7 लाइनों को देखने में बीमार था इसलिए मैंने इसे अपनी फ़ाइल लपेट ली है और इसमें स्वयं भी शामिल है। इसमें कुछ अतिरिक्त # डिफाइन (यानी ULONG_PTR) भी शामिल हैं क्योंकि हमारा मुख्य ऐप प्लेटफार्म एसडीके के साथ संकलित नहीं होगा :-(

  1. यह पुष्टि की गई है। कुछ भी जगह से बाहर नहीं है।
  2. मैंने ऐसा किया है - निर्माण निर्देशिका हटा दी
  3. मैं कड़ी-कोडित पथ का कभी भी उपयोग नहीं करता हूं।
0
जोड़ा

@ कर्ट: मुझे लगता है कि आप निकटतम आए हैं। मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि मैंने अपने मूल प्रश्न में जवाब दिया है।

GetMessage is a define in Windows.h wrapped in a ifndef block to switch between Ansi (GetMessageA) and Unicode (GetMessageW).

0
जोड़ा

मान लीजिए कि आपने जो कुछ भी नहीं होना चाहिए, उसे हटाने के लिए परियोजना सेटिंग्स के साथ फटज नहीं किया है (जहां मैं बाहरी निर्भरता की अपेक्षा करता हूं जैसे User32.lib होना):

उपकरण जांचें | विकल्प | निर्देशिकाएं | पुस्तकालय (यहां स्मृति से जा रहे हैं) और सुनिश्चित करें कि आप आम-ऑल-गार्डन विविधता lib निर्देशिकाओं को याद नहीं कर रहे हैं (फिर से, मेरे सामने वीसी 6 के बिना, मैं आपको नहीं बता सकता कि वे क्या हैं)

0
जोड़ा

माइक्रोसॉफ्ट ने एएनएसआई बनाम यूनिकोड एपीआई को संभालने के तरीके के साथ यह एक सामान्य समस्या है। चूंकि वे फ़ंक्शन नामों के 'ए' या 'डब्ल्यू' संस्करणों को हल करने वाले फ़ंक्शन नामों के लिए मैक्रोज़ को परिभाषित करके किए गए सभी (या बहुत अधिक हैं) हैं, इसलिए आप सुरक्षित रूप से अपने नेमस्पेस / क्लास / स्ट्रक्चर / एनम / फ़ंक्शन जो Windows API नाम से मेल खाता है।

Windows.h मैक्रोज़ अन्य सभी नामस्थानों पर किसी न किसी तरह से चलाते हैं।

0
जोड़ा

एक संभावना Win32 ANSI / यूनिकोड "नाम-मैंगलिंग" के साथ है, जो प्रतीक GetMessage को GetMessageA या GetMessageW में बदल देती है। तीन संभावनाएं हैं:

  1. Windows.h लोड नहीं किया गया है, इसलिए GetMessage रहता है GetMessage

  2. Windows.h को एएनएसआई के लिए सेट प्रतीकों के साथ लोड किया गया था, इसलिए GetMessage बन जाता है GetMessageA

  3. Windows.h यूनिकोड के लिए सेट प्रतीकों के साथ लोड किया गया था, इसलिए GetMessage बन जाता है GetMessageW

यदि आपने दो अलग-अलग फ़ाइलों को दो तरीकों से संकलित किया है जो दो अलग-अलग परिदृश्यों को ट्रिगर करते हैं, तो आपको एक लिंकर त्रुटि मिल जाएगी। त्रुटि संदेश इंगित करता है कि comms :: अपवाद वर्ग उपरोक्त # 2 का उदाहरण था - शायद यह कहीं भी उपयोग किया जाता है कि windows.h लोड नहीं किया गया है?

अन्य चीजें जो मैं आपके स्थान पर करता हूं, जैसे कि नियमित रूप से:

1) सुनिश्चित करें कि मेरे शामिल और लाइब्रेरी पथ में ऐसी कोई भी चीज़ नहीं है जिसे मैं उम्मीद नहीं कर रहा हूं।

2) यदि आवश्यक हो तो किसी भी अतिरिक्त ऑब्जेक्ट फ़ाइलों को हटाने, "साफ बनाएं" और उसके बाद इसे मैन्युअल रूप से सत्यापित करें।

3) सुनिश्चित करें कि कथन शामिल करने में कोई कठोर पथ नहीं हैं जिसका अर्थ यह नहीं है कि जब परियोजना मूल रूप से पुनर्निर्मित की गई थी तो उनका क्या मतलब था।

संपादित करें: स्वरूपण के साथ लड़ना :(

0
जोड़ा