2011-03-11 26 views
10

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

+0

मैं "प्रतीक" शब्द के लिए शब्दकोश में देखता हूं ... (क्षमा करें, यह देर हो चुकी है ...) – dappawit

उत्तर

23

कहो इसे मेरा प्रारंभ विन्यास है:

/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
bar.o: In function `baz()': 
bar.cpp:(.text+0xd): undefined reference to `Foo::bar()' 
collect2: ld returned 1 exit status 

मैं सभी ओ और उदारीकरण फ़ाइलों को ग्रेप साथ लापता प्रतीक को देख के साथ शुरू करते हैं।

$ grep 'Foo.*bar' *.o *.lib *.so 
Binary file bar.o matches 
Binary file foo.o matches 

तब मैं वें nm उपकरण का प्रयोग करें प्रत्येक वस्तु फ़ाइल का निरीक्षण करने के अगर प्रतीक वहाँ लापता या कार्यान्वित किया जाता है।

$ nm foo.o 
00000000 T _ZN3Foo3barEv 

$ nm bar.o 
00000000 T _Z3bazv 
     U _ZN3Foo3barEv 
     U __gxx_personality_v0 

अब मुझे पता है कि Foo :: bar() foo.o में लागू किया गया है और इस फ़ाइल को निष्पादन योग्य में लिंक कर सकता है। तो अगला भाग यह जांचना है कि क्यों foo.o लिंक कमांड में शामिल नहीं है।

कभी-कभी आपको कोई कार्यान्वयन प्रतीक नहीं मिलता है। यह आम तौर पर तब होता है जब कार्यान्वयन इकाई निर्माण नहीं होती है, या प्रतीक (#ifdef, प्रतीक दृश्यता) शामिल नहीं है। ऐसे मामले में मैं .cpp फ़ाइल की खोज करता हूं जहां प्रतीक परिभाषित किया गया है, फ़ाइल उत्पन्न करने के लिए make $file.o चलाएं, और बाद में फ़ाइल का निरीक्षण करें। जब smbol वहां होता है, तो मैं पुस्तकालय या निष्पादन योग्य बनाना जारी रखता हूं जहां यह फ़ाइल डाल दी जाती है।

+0

आपकी जानकारी के लिए धन्यवाद। लिंकर द्वारा ज्ञात पुस्तकालयों को डंप करने के लिए -ब्लू-टी विकल्प जोड़ने के लिए भी उपयोगी है। क्या आप वास्तव में मुश्किल मामलों के लिए कुछ जानते हैं? उदाहरण के लिए दो आश्रित स्थैतिक पुस्तकालय गलत क्रम में शामिल हैं? – danatel

+0

@ डानाटेल मुझे खेद है, लेकिन मेरे पास गलत लाइब्रेरी निर्भरताओं को डीबग करने के लिए कोई सामान्य तकनीक नहीं है, क्योंकि प्रत्येक मामले अलग है। – Rudi

+0

यह एक अच्छा जवाब है। आश्चर्य है कि इसे क्यों स्वीकार नहीं किया गया है। –

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