2009-11-07 15 views
35

लगभग अंतिम चरण, लेकिन अभी भी कुछ अजीब मिली त्रुटियाँ ....अपरिभाषित प्रतीकों "के लिए vtable ..." और "टाइपइन्फो ..."?

bash-3.2$ make 
g++ -Wall -c -g Myworld.cc 
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem 
Undefined symbols: 
    "vtable for Obstacle", referenced from: 
     Obstacle::Obstacle()in Myworld.o 
    "typeinfo for Obstacle", referenced from: 
     typeinfo for RECTANGLEin RECTANGLE.o 
     typeinfo for CIRCLEin CIRCLE.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [solvePlanningProblem] Error 1 

क्या vtable और typeinfo का अर्थ क्या है?

+0

[अपने मूल प्रश्न] (http://stackoverflow.com/questions/1693471/undefined-symbols-ld-symbol-not-found) पर वापस जाने के लिए याद रखें और कुछ कोड पोस्ट करें या लोगों के कुछ प्रश्नों का उत्तर दें तुमसे पूछा इससे आपको जल्दी परिणाम मिलेंगे। :) – Troubadour

+0

मैं वास्तव में चाहता हूं कि साइट बस गायब हो, धन्यवाद, मैं – Lisa

+0

पर वापस जाऊंगा कृपया उत्तर यहां प्राप्त करें! http://stackoverflow.com/questions/1458180/vtable-for-referenced-from-compile-error-xcode –

उत्तर

1

vtable और typeinfo सी ++ कंपाइलर द्वारा उत्पन्न आंतरिक संरचनाएं हैं। Vtable का उपयोग मूल्यवान कार्यों को कॉल करने के लिए किया जाता है और टाइपिफ़ो का उपयोग आरटीटीआई के लिए किया जाता है।

विभिन्न कंपाइलरों के पास इन संरचनाओं को उत्पन्न करने के लिए अलग-अलग रणनीतियां होती हैं। एक रणनीति जो मैंने देखी है वह है कि वे उसी ऑब्जेक्ट फ़ाइल में तालिका उत्पन्न करेंगे जिसमें कक्षा में पहला वर्चुअल फ़ंक्शन शामिल है।

+0

जहां तक ​​उपरोक्त त्रुटि का सवाल है, अपरिभाषित प्रतीकों का क्या अर्थ है? – Lisa

2

क्या आपके पास Obstacle.cc फ़ाइल है? यदि ऐसा है, तो आपको यह सुनिश्चित करना होगा कि यह Obstacle.o में बनाया गया हो, और जब आप अपने प्रोग्राम को लिंक करते हैं तो Obstacle.o कमांड लाइन में जोड़ा जाता है।

साथ ही, सुनिश्चित करें कि आप घोषित सभी गैर-शुद्ध-वर्चुअल विधियों को परिभाषित करते हैं। यदि आप एक शुद्ध वर्चुअल विनाशक घोषित करते हैं, तो आपको इसे भी परिभाषित करने की आवश्यकता है।

+0

मेरे पास एक Obstacle.cc होना चाहिए, क्योंकि इसमें केवल कुछ वर्चुअल फ़ंक्शन हैं? – Lisa

+0

@ लिसा: जरूरी नहीं, लेकिन एक .h फ़ाइल में गैर-इनलाइन गैर-टेम्पलेट विधियों/कार्यों को परिभाषित करने से एक अलग लिंकर त्रुटि (एकाधिक परिभाषाएं) हो सकती हैं। तो मैं मानता हूं कि बाधा में सबकुछ इनलाइन है। क्या आपने निर्माता और कार्यकर्ता समेत सभी बाधाओं के सदस्यों के कार्यों के लिए परिभाषाएं लिखीं? ध्यान दें कि यदि बाधा के पास शुद्ध आभासी विनाशक है, तो आपको अभी भी इसके लिए एक परिभाषा लिखनी होगी। – bk1e

+0

क्या बाधा केवल शुद्ध वर्चुअल फ़ंक्शन है? हड़ताल करें - जब यह vtables की बात आती है इससे कोई फर्क नहीं पड़ता। आपको एक बाधा की आवश्यकता है। इसलिए संकलक कहीं बाधा की वर्चुअल टेबल स्टोर करने और जानकारी टाइप करने के लिए है। – outis

70

तो बाधा एक सार आधार वर्ग है, तो सुनिश्चित करें कि आप अपने सभी आभासी तरीकों "शुद्ध आभासी" घोषित करते हैं:

virtual void Method() = 0; 

= 0 संकलक है कि इस विधि एक व्युत्पन्न वर्ग द्वारा ओवरराइड किया जाना चाहिए बताता है, और शायद अपना खुद का कार्यान्वयन नहीं हो सकता है।

यदि कक्षा में कोई गैर-शुद्ध वर्चुअल फ़ंक्शन शामिल है, तो कंपाइलर मान लेगा कि उनके पास कहीं भी कार्यान्वयन है, और इसकी आंतरिक संरचनाएं (vtable और typeinfo) उसी ऑब्जेक्ट फ़ाइल में उनमें से एक के रूप में उत्पन्न हो सकती हैं; यदि उन कार्यों को लागू नहीं किया गया है, तो आंतरिक संरचनाएं गायब होंगी और आपको ये त्रुटियां मिलेंगी।

+0

मैं अभी इस समस्या को अपने कोड में आया हूं। मुझे यह पृष्ठ Google खोज के माध्यम से मिला, और मैंने आपके द्वारा किए गए परिवर्तन को बनाया और इसे ठीक कर दिया। धन्यवाद! : डी – Aishwar

+0

उपर्युक्त जैसा - Google पर पाया गया - हल की गई समस्या तुरंत, समाधान त्वरित और आसान था! मैंने वर्चुअल फ़ंक्शंस की सूची में एक और शुद्ध वर्चुअल सदस्य जोड़ा था और = 0 टोकन जोड़ने के लिए भूल गया था! ओह – Marm0t

+0

महान उत्तर - मेरी समस्या भी हल हो गई! – TCSGrad

5

कक्षा बाधा को एक आभासी विनाशक की आवश्यकता है। विनाशक परिभाषा को बदलें:

virtual ~Obstacle(); 

एक विनाशक की परिभाषा वर्चुअल फ़ंक्शंस वाले वर्ग के लिए vtable भी बनाती है। यह भी सुनिश्चित करता है कि बेस क्लास पॉइंटर के माध्यम से व्युत्पन्न क्लास इंस्टेंस का डिलीट सही काम करता है।

(मेरा उत्तर की प्रति What should I do with this strange error? जो एक नकली प्रतीत हो रहा है सवाल करने के लिए।)

+2

मेरे मामले में, मुझे केवल विनाशक को परिभाषित करने की आवश्यकता नहीं थी बल्कि मेरी सीपीपी फ़ाइल में कार्यान्वयन को परिभाषित करना भी भूल गया था। – Ricket

1

वहाँ एक और कारण आपको यह त्रुटि प्राप्त कर सकते है, और सिर्फ इसे यहाँ दस्तावेज़ के लिए चाहते हैं। मैं एक स्थिर पुस्तकालय से जुड़ा था जिसमें आरटीटीआई नहीं थी। तो सी ++ ध्वज -fno-rtti का उपयोग मेरे लिए तय किया गया है। यदि आपको आरटीटीआई की आवश्यकता नहीं है, तो आप इस ध्वज का भी उपयोग कर सकते हैं। उम्मीद है की यह मदद करेगा।

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