2008-08-29 15 views
32

सी ++ में प्रोजेक्ट बनाने के दौरान, मुझे डिबगिंग लिंकिंग त्रुटियों को मुश्किल लगती है, खासकर जब अन्य लोगों के कोड को उठाते हैं। लिंकिंग त्रुटियों को डीबग करने और फिक्स करने के लिए लोग किस रणनीति का उपयोग करते हैं?लिंकिंग त्रुटियों को डिबग करने के लिए सर्वोत्तम अभ्यास

उत्तर

22

सुनिश्चित नहीं है कि आपकी विशेषज्ञता का स्तर क्या है, लेकिन यहां मूल बातें हैं।

नीचे वीएस 2005 से एक लिंकर त्रुटि है - हाँ, यदि आप इससे परिचित नहीं हैं तो यह एक विशाल गड़बड़ है।

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" ([email protected]@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" ([email protected]@[email protected]@[email protected]) 

अंक की एक जोड़ी पर ध्यान केंद्रित करने के होते हैं:

  • "ByteComparator.obj" - एक ByteComparator.cpp फ़ाइल के लिए देखो, इस लिंकर समस्या
  • "पूर्णांक का स्रोत है __cdecl does_not_exist (शून्य) "- यह प्रतीक यह नहीं मिल सकता है, इस मामले में एक समारोह के नाम पर रखा गया does_not_exist()

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

यदि आप वीएस2005 का उपयोग कर रहे हैं, तो आप "प्रोजेक्ट निर्भरता ..." राइट-क्लिक मेनू का उपयोग करेंगे। यदि आप जीसीसी का उपयोग कर रहे हैं, तो आप निष्पादन योग्य पीढ़ी चरण (जीसीसी को .o फाइलों के समूह के साथ बुलाए जाने के लिए) बनाने के लिए अपनी मेकफ़ाइल देखेंगे और गायब .o फ़ाइल जोड़ें।


दूसरे परिदृश्य में, आपको एक "बाहरी" निर्भरता याद आ रही है, जिसके लिए आपके पास कोड नहीं है। Win32 लाइब्रेरी अक्सर उन स्थिर पुस्तकालयों में लागू होते हैं जिन्हें आपको लिंक करना होता है। इस मामले में, MSDN या "Microsoft Google" पर जाएं और API की खोज करें। एपीआई विवरण के नीचे पुस्तकालय का नाम दिया गया है। इसे अपने प्रोजेक्ट गुणों में जोड़ें "कॉन्फ़िगरेशन गुण-> लिंकर-> इनपुट-> अतिरिक्त निर्भरता" सूची। उदाहरण के लिए, फ़ंक्शन टाइम गेटटाइम() का page on MSDN आपको पृष्ठ के निचले हिस्से में Winmm.lib का उपयोग करने के लिए कहता है।

+0

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

2

मेरे द्वारा चलाए जाने वाले सामान्य लिंकिंग त्रुटियों में से एक यह है कि जब किसी फ़ंक्शन को परिभाषित किया जाता है तो इसका अलग-अलग उपयोग किया जाता है। यदि आपको ऐसी कोई त्रुटि दिखाई देती है तो आपको यह सुनिश्चित करना चाहिए कि आपके द्वारा उपयोग किए जाने वाले प्रत्येक फ़ंक्शन को कुछ .h फ़ाइल में ठीक से घोषित किया गया है।
आपको यह भी सुनिश्चित करना चाहिए कि सभी प्रासंगिक स्रोत फ़ाइलों को एक ही lib फ़ाइल में संकलित किया गया है। एक त्रुटि जो मैंने चलाई है, जब मेरे पास दो अलग-अलग पुस्तकालयों में संकलित फ़ाइलों के दो सेट हैं, और मैं पुस्तकालयों के बीच क्रॉस-कॉल करता हूं।

क्या आपके मन में कोई विफलता है?

+0

यह क्रॉस-कॉल, यह किस प्रकार की त्रुटि देता है? – Doug

3

सी-रनटाइम लाइब्रेरी अक्सर सबसे बड़ा अपराधी होता है। यह सुनिश्चित करना कि आपकी सभी परियोजनाओं में एक ही सेटिंग है जो एकल बनाम बहु-थ्रेडिंग और स्थिर बनाम डीएलएल है।

एमएसडीएन दस्तावेज यह इंगित करने के लिए अच्छा है कि कौन सा lib एक विशेष Win32 API कॉल की आवश्यकता है यदि यह अनुपलब्ध हो।

इसके अलावा यह आमतौर पर वर्बोज़ झंडा को चालू करने और सुराग की तलाश में आउटपुट के माध्यम से wading करने के लिए नीचे आता है।

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