दिलचस्प पोस्ट
एंड्रॉइड वेबदृश्य और स्थानीय स्टोरेज मूल्यों के आधार पर मानचित्र <कुंजी, मान> सॉर्ट करें (जावा) मैं किसी तृतीय-पक्ष एपीआई का उपयोग करते हुए सी # में एक फ़ाइल कैसे जंप करूँ? जावास्क्रिप्ट 'होस्टिंग' पायथन में एक समारोह "कॉल" करने का क्या अर्थ है? स्ट्रिंग से सामान्य प्रकार रूपांतरण एंड्रॉइड पर सर्वर से पाठ फ़ाइल पढ़ना ".configure" विकल्प "-बिल्ड", "–होस्ट" और "-क्षेत्र" के अंतर क्या है? पायथन 3: आयातईयर "सेटअप मॉड्यूल नामक कोई मॉड्यूल नहीं" आईओएस 7 – डिफॉल्ट व्यू नियंत्रक को इन्स्तांत करने में विफल SQL सर्वर में दो भिन्न सर्वर से डेटा का चयन करना क्या आईबीओलेट को एक संपत्ति और संश्लेषित होने की जरूरत है? एंड्रॉइड फाइल चयनकर्ता प्रतिवर्ती छद्म यादृच्छिक अनुक्रम जनरेटर पेज से दूर नेविगेट किए बिना एक डाउनलोड विंडो खोलने का सबसे आसान तरीका

क्यूटी लिंकर त्रुटि: "vtable के लिए अपरिभाषित संदर्भ"

यह मेरा हैडर है:

#ifndef BARELYSOCKET_H #define BARELYSOCKET_H #include <QObject> //! The First Draw of the BarelySocket! class BarelySocket: public QObject { Q_OBJECT public: BarelySocket(); public slots: void sendMessage(Message aMessage); signals: void reciveMessage(Message aMessage); private: // QVector<Message> reciveMessages; }; #endif // BARELYSOCKET_H 

यह मेरा वर्ग है:

 #include <QTGui> #include <QObject> #include "type.h" #include "client.h" #include "server.h" #include "barelysocket.h" BarelySocket::BarelySocket() { //this->reciveMessages.clear(); qDebug("BarelySocket::BarelySocket()"); } void BarelySocket::sendMessage(Message aMessage) { } void BarelySocket::reciveMessage(Message aMessage) { } 

मुझे एक लिंकर त्रुटि मिलती है:

 undefined reference to 'vtable for BarelySocket' 
  • इसका अर्थ है कि मेरे पास वर्चुअल विधि लागू नहीं है लेकिन मेरी कक्षा में कोई आभासी तरीके नहीं हैं I
  • मैंने वेक्टर को यह सोचते हुए टिप्पणी की कि यह कारण था, लेकिन त्रुटि दूर नहीं हुई।
  • Message एक जटिल struct , लेकिन फिर भी int का उपयोग करने के बजाय चीजों को ठीक नहीं किया।

वेब के समाधान से एकत्रित समाधान "क्यूटी लिंकर त्रुटि: "vtable के लिए अपरिभाषित संदर्भ""

जब भी आप Q_OBJECT मैक्रो में एक नया कॉल जोड़ते हैं, तो आपको क्यूएमके को फिर से चलाने की आवश्यकता है आपके द्वारा उल्लेखित vtables समस्या सीधे उस से संबंधित है

बस क्यूमेक चलाएं और आप संभालने जाने के लिए अच्छा होना चाहिए कि आपके कोड में कोई अन्य समस्या नहीं है।

मैंने इस समस्या को सुलझाने के लिए बहुत सारे तरीके देखे हैं, लेकिन ऐसा क्यों होता है इसका कोई स्पष्टीकरण नहीं है, तो यहां चला जाता है

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

सामान्य तौर पर, समस्या को प्रत्येक टीयू में वीटेल बनाकर हल किया जा सकता है जहां क्लास को परिभाषित किया गया है, और उसके बाद लिंकर डुप्लिकेट को खत्म करने दें। चूंकि कक्षा परिभाषाओं को हर घटना पर ओडीआर द्वारा समान होना चाहिए, यह सुरक्षित है हालांकि, यह संकलन, ब्लोट्स ऑब्जेक्ट फाइलों को भी धीमा कर देता है, और लिंकर को अधिक काम करने की आवश्यकता है।

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

क्यूटी कक्षाओं के मामले में, वे आमतौर पर Q_OBJECT मैक्रो से शुरू करते हैं, और इस मैक्रो में घोषणा शामिल है

 virtual const QMetaObject *metaObject() const; 

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

इसलिए जब आपके पास कोई नया हेडर होता है जो QObject वर्ग को परिभाषित करता है, तो आपको qmake को फिर से चलाने की qmake ताकि यह आपके qmake को नए हेडर पर qmake चलाने और परिणामी .cpp फ़ाइल संकलित करने के लिए अपडेट करे।

मैंने एक छोटी सी "main.cpp" फ़ाइल के अंदर एक छोटी सी कक्षा बनाई है, जिसके बाद मैंने कुछ परीक्षण करने के लिए बनाई थी।

एक घंटे या उससे भी ज्यादा समय के लिए फिट होने के बाद, मैं अंत में मुख्य सीपीपी से बाहर आ गया और एक स्टैंडअलोन एचपीपी फ़ाइल में चला गया, .पीआरओ (प्रोजेक्ट) फाइल को अपडेट किया और इस परियोजना ने पूरी तरह ठीक बनाया। यह शायद इस मुद्दे पर न हो, लेकिन मुझे लगा कि यह उपयोगी जानकारी होगी।

अनुभव से: बार-बार एक क्यूमेक और एंड क्लीन एंड एंड बनाने में मदद करता है मैं व्यक्तिगत रूप से अनुभव करता हूं कि कभी-कभी परिवर्तन की खोज / कैशिंग प्रभाव / जो कुछ भी मैं नहीं जानता- XXXXX मैं क्यों नहीं कह सकता, लेकिन यह पहली बात है जब मुझे इस प्रकार की त्रुटि मिलती है।

btw। वहाँ एक टाइपो पर> recive <है

आप अपने कंस्ट्रक्टर (प्रारंभिक सूची में) में QObject कन्स्ट्रक्टर को कॉल करना भूल गए थे। (हालांकि यह त्रुटि को हल नहीं करता है)

मेरे लिए, मुझे उस लॉग लॉग से देखा गया जो कि मॉक को नहीं बुलाया गया था। साफ सभी मदद नहीं किया इसलिए मैंने हटाया .pro.user, पुनः आरंभ आईडीई और यह चाल किया।

संकेतों का कार्यान्वयन नहीं होना चाहिए (यह क्यूटी द्वारा उत्पन्न होगा) अपने .cpp फ़ाइल से reciveMessage कार्यान्वयन निकालें यह आपकी समस्या का समाधान कर सकता है

एक अन्य चीज जो मैंने देखी है: चूंकि BarelySocket से BarelySocket क्लास का उत्तराधिकार होता है, उसे विनाश के दौरान समस्या से बचने के लिए एक वर्चुअल डिस्ट्रक्टर होना चाहिए। यह सभी वर्ग के लिए किया जाना चाहिए जो किसी दूसरे वर्ग से प्राप्त हो।

जब आप QOBject से एक वर्ग प्राप्त करते हैं (और Q_OBJECT मैक्रो का उपयोग करते हैं), खासकर कन्स्ट्रक्टर और डिस्ट्रक्टर क्लासेस दोनों को परिभाषित करने और बनाने के लिए मत भूलना संकलक डिफॉल्ट कन्स्ट्रक्टर / डिस्ट्रक्टर्स का उपयोग करने के लिए यह पर्याप्त नहीं है सफाई / चल रहे क्यूमेक (और आपकी एमओसी_ फाइलों को साफ करने) पर सलाह अभी भी लागू है यह मेरी इसी तरह की समस्या तय की।

मैं इस त्रुटि के घंटे के साथ संघर्ष किया एक अलग फ़ोल्डर में। सीपीपी और .h फाइल डालकर इसका हल। (!!) फिर .pro फ़ाइल में फ़ोल्डर जोड़ा गया: INCLUDEPATH + = $$ {_ PRO_FILE_PWD _} /../ MyClasses / CMyClassWidget

और फिर। सीपीपी और .h फ़ाइल को जोड़ा। आखिर में काम करता है

मुझे एक और कारण मिला है कि आप इसे क्यों देख सकते हैं – चूंकि qmake आपकी क्लास फ़ाइलों के माध्यम से पार्स करता है, अगर आपने इन्हें गैर-मानक तरीके से संशोधित किया है तो आपको यह त्रुटि मिल सकती है मेरे मामले में मेरे पास एक कस्टम संवाद था जो कि QDialog से विरासत में मिला था, लेकिन मैं केवल चाहते थे कि लिनक्स के लिए निर्माण करते समय संकलन और चलाने के लिए, विंडोज़ या ओएसएक्स नहीं। मैं सिर्फ #ifdef __linux__ कक्षा को बाहर #ifdef __linux__ , इसलिए इसे संकलित नहीं किया, लेकिन लिनक्स में हालांकि __linux__ को परिभाषित किया गया था कि वह qmake फेंक रहा था।