2008-08-08 14 views
6

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

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

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

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

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

-------------------- कॉन्फ़िगरेशन: टेस्टकॉम - Win32 डीबग ------------------ - लिंकिंग ... comms.lib (IOCompletionPort.obj) : त्रुटि एलएनके 2001: अनसुलझा बाहरी प्रतीक "सार्वजनिक: वर्चुअल क्लास std :: basic_string, कक्षा std :: आवंटक> __thiscall कॉमम्स :: अपवाद :: GetMessageA (शून्य) const "(? GetMessageA @ अपवाद @ कॉमम्स @@ यूबीई? एवी? $ basic_string @ डीयू? $ char_traits @ डी @ std @@ वी? $ आवंटक @ डी @ 2 @@ std @@ XZ) डीबग/टेस्टकॉम .exe: घातक त्रुटि LNK1120: 1 अनसुलझा बाहरी link.exe निष्पादित करने में त्रुटि।

TestComms.exe - 2 त्रुटि (s), 0 चेतावनी (रों)

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

उत्तर

4

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

  1. windows.h लोड नहीं की गई है, तो GetMessage रहता GetMessage

  2. windows.h एएनएसआई के लिए निर्धारित प्रतीकों के साथ लोड किया गया था, इसलिए GetMessageGetMessageA

  3. हो जाता है विंडोजएच को यूनिकोड के लिए सेट प्रतीकों के साथ लोड किया गया था, इसलिए GetMessageGetMessageW

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

अन्य चीजें मैं सिर्फ दिनचर्या के एक मामले के रूप में अपनी जगह में क्या चाहते हैं,:

1) सुनिश्चित करें कि शामिल मेरे और पुस्तकालय रास्तों कुछ भी है कि मैं उम्मीद कर रहा नहीं कर रहा हूँ शामिल नहीं है।

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

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

संपादित करें: स्वरूपण :(

0

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

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

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

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

1

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

GetMessage Ansi (GetMessageA) और यूनिकोड (GetMessageW) के बीच स्विच करने के लिए एक ifndef ब्लॉक में लपेटा गया Windows.h में परिभाषित किया गया है।

0

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

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

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