दिलचस्प पोस्ट
प्रतिलिपि / पेस्ट / से संपादन टेक्स्ट को अक्षम कैसे करें लिनक्स पर जावा के साथ सक्रिय निर्देशिका के विरुद्ध प्रमाणन M2E और ग्रहण स्रोत फ़ोल्डर्स के रूप में ग्रहण स्रोत फ़ोल्डरों के रूप में उत्पन्न होते हैं नए सी / सी ++ मानकों के लिए विजुअल स्टूडियो समर्थन? मैं एक ऑब्जेक्ट को रनटाइम पर कैसे जोड़ सकता हूं? क्या किसी भी जेवीएम के जेआईटी कम्पाइलर कोड उत्पन्न करते हैं जो वैक्टरित फ्लोटिंग प्वाइंट निर्देशों का उपयोग करता है? जावास्क्रिप्ट समापन काम नहीं कर रहा है jQuery DOM दृश्य स्रोत में दिखाई नहीं देता नियंत्रकों को देखें: विचारों के बीच प्रोग्राम को किस प्रकार स्विच करना है? एंड्रॉइड: उपयोगकर्ता की भाषा में सप्ताह के वर्तमान दिन (सोमवार, आदि …) कैसे प्राप्त करें? मूल मैक पते का पता लगाने के बाद कैसे धोखा दिया गया है? क्यों सी # अनुक्रमित गुणों को लागू नहीं करता है? एक्सलेमेंट नामस्थान (कैसे करें?) एक्सएमएल दस्तावेज़ीकरण में जेनेरिक वर्गों और विधियों को कैसे संदर्भित किया जाए बहु थ्रेडेड पायथन एप और सॉकेट कनेक्शन के साथ समस्या

जीसीसी सी + + लिंकर त्रुटियां: 'XXX के लिए वीटेबल' के लिए अनिर्धारित संदर्भ, 'क्लासनाम :: क्लासैनम ()' के लिए अनिर्धारित संदर्भ

मैं एक सी ++ परियोजना स्थापित कर रहा हूं, उबंटू x 64 पर, एक्लिप्स-सीडीटी का उपयोग कर रहा हूं। मैं मूल रूप से एक नमस्ते दुनिया बना रहा हूं और एक वाणिज्यिक तृतीय पक्ष पुस्तकालय से जुड़ रहा हूं।

मैंने शीर्ष लेख फ़ाइलें शामिल की हैं, उनके पुस्तकालयों से जुड़ी हैं, लेकिन मैं अभी भी लिंकर त्रुटियाँ प्राप्त करता हूं क्या यहाँ कुछ संभव समस्याएं हैं (स्पष्ट है कि मैं सही पुस्तकालय से जुड़ रहा हूं, 99% यकीन है)।

  1. क्या स्थिर पुस्तकालयों की पुष्टि करने का कोई तरीका है जो मैं 64 बिट से जोड़ रहा हूं?
  2. क्या इस बात की पुष्टि करने का कोई तरीका है कि पुस्तकालय में कक्षा (और विधियां) हैं, मैं यह उम्मीद कर रहा हूं?

ग्रहण कहते हैं:

 बिल्डिंग लक्ष्य: लिंकप्राब्लेम
 Invoking: जीसीसी सी ++ लिंकर
 जी ++ -एल / ​​होम / नोटूॉट / वर्कस्पेस / एमेलीब -3 / एमेलीब / लक्ष्य / बिन-ओ "लिंकप्रोबल" ./src/LinkProblem.o -lsomelib1 -lpthread -lsomelib2 -lsomelib3
 ./src/LinkProblem.o: फ़ंक्शन `मुख्य 'में:
 /home/notroot/workspace/LinkProblem/Debug/../src/LinkProblem.cpp:17: `कुछ क्लास :: बंद () 'के लिए अपरिभाषित संदर्भ
 ./src/LinkProblem.o: फ़ंक्शन `SomeOtherClass 'में:
 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148: `कुछ क्लासेस :: कुछ क्लास () 'के लिए अपरिभाषित संदर्भ
 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148: `कुछ अन्य क्लास के लिए वीटेल 'के लिए अपरिभाषित संदर्भ
 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h.151: `कुछ क्लासेस :: ~ कुछ क्लास () के लिए अपरिभाषित संदर्भ '
 ./src/LinkProblem.o: फ़ंक्शन `~ SomeOtherClass 'में:
 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140: `कुछ अन्य क्लास के लिए वीटेल 'के लिए अपरिभाषित संदर्भ
 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140: `कुछ क्लासेस :: ~ कुछ क्लास () के लिए अपरिभाषित संदर्भ '
 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140: `कुछ क्लासेस :: ~ कुछ क्लास () के लिए अपरिभाषित संदर्भ '
 संग्रह 2: एलडी ने 1 बाहर निकलें की स्थिति लौटा दी है
 बनाओ: *** [लिंकप्राब्लेम] त्रुटि 1

वेब के समाधान से एकत्रित समाधान "जीसीसी सी + + लिंकर त्रुटियां: 'XXX के लिए वीटेबल' के लिए अनिर्धारित संदर्भ, 'क्लासनाम :: क्लासैनम ()' के लिए अनिर्धारित संदर्भ"

उन विधियों को मानते हुए कि यह एक आदेश समस्या की तरह दिखता है libs में से एक है।

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

यह काम किस प्रकार करता है:

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

उदाहरण:

वस्तुओं की आवश्यकता है:

  • खुला
  • बंद करे
  • BatchRead
  • BatchWrite

लिब 1 प्रदान करता है:

  • खुला
  • बंद करे
  • पढ़ना
  • लिखना

लिब 2 प्रदान करता है

  • बैचरेड (लेकिन इसका उपयोग लाइब 1: पठन)
  • बैचवर्इट (लेकिन लिब 1: लिखने का उपयोग करता है)

अगर इस तरह से जुड़े:

जीसीसी-ओ प्लॉप प्लॉप.ओ-एल 1-एल 2

फिर लिंकर पढ़ने और प्रतीकों को हल करने में असफल रहेगा।

लेकिन अगर मैं इस तरह से इस आवेदन को लिंक करता हूं:

जीसीसी-ओ प्लॉप प्लॉप.ओ-एल -2-एल 1

तो यह सही ढंग से लिंक होगा। जैसा कि एल 2 बैच रीड और बैचवर्इट निर्भरता को हल करता है, लेकिन यह भी दो नए लोगों को पढ़ता है (पढ़ना और लिखना)। जब हम एल 1 के साथ लिंक करते हैं तो सभी चार निर्भरता हल हो जाती हैं।

यह लिंकर त्रुटि आमतौर पर (मेरे अनुभव में) का अर्थ है कि आपने एक क्लास में एक वर्चुअल फ़ंक्शन को एक घोषणा के साथ ओवरराइड कर दिया है, लेकिन विधि के लिए कोई परिभाषा नहीं दी है उदाहरण के लिए:

class Base { virtual void f() = 0; } class Derived : public Base { void f(); } 

लेकिन आपने एफ की परिभाषा नहीं दी है। जब आप क्लास का उपयोग करते हैं, तो आपको लिंकर त्रुटि मिलती है एक सामान्य लिंकर त्रुटि की तरह, ऐसा इसलिए है क्योंकि कंपाइलर को पता था कि आप किस बारे में बात कर रहे थे, लेकिन लिंकर को परिभाषा नहीं मिली। यह संदेश समझने में बहुत मुश्किल है

Qt C ++ यह त्रुटि दिखाएगा जब आप एक क्लास को बदलते हैं जैसे कि यह अब QObject से प्राप्त होता है (यानी यह अब सिग्नल / स्लॉट का उपयोग कर सकता है)। Qmake -r चलाना मोक फोन करेगा और इस समस्या को ठीक करेगा।

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

मेरे लिए समस्या बहुत अस्पष्ट हो गई है मेरा वर्ग इस तरह दिखता है:

 //----------------------------------------- // libbase.h class base { public: base() { } virtual ~base() { } virtual int foo() { return 0; } } //----------------------------------------- //----------------------------------------- // libbase.cpp #include "libbase.h" //----------------------------------------- //----------------------------------------- // main.h class derived : public base { public: virtual int foo() ; } //----------------------------------------- //----------------------------------------- // main.cpp int main () { derived d; } //----------------------------------------- 

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

मेरे मुख्य कोड में जहां मैं इस वर्ग से प्राप्त हुआ था, लिंकर ने मेरी कक्षा को बेस क्लास से जोड़ने का प्रयास किया और उसके vtable लेकिन वोलेबल को हटा दिया गया था।

इसका समाधान क्लास घोषणापत्र के बाहर कम से कम एक वर्चुअल फ़ंक्शन के निकाय घोषित करना था, जैसे:

 //----------------------------------------- // libbase.h class base { public: base() { } virtual ~base() ; //-- No longer declared 'inline' virtual int foo() { return 0; } } //----------------------------------------- //----------------------------------------- // libbase.cpp #include "libbase.h" base::~base() { } //----------------------------------------- 

क्यूटी 4 के साथ समस्याओं के संबंध में, मैं उपर्युक्त क्यूमक एमओसी विकल्प का उपयोग नहीं कर सका। लेकिन यह वैसे भी समस्या नहीं थी। कक्षा परिभाषा में मेरे पास निम्न कोड था:

 class ScreenWidget : public QGLWidget { Q_OBJECT // must include this if you use Qt signals/slots ... }; 

मुझे लाइन "Q_OBJECT" निकालना पड़ा क्योंकि मेरे पास कोई संकेत या स्लॉट परिभाषित नहीं थे

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

यह त्रुटि तब भी उत्पन्न होगी जब हम केवल बेस क्लास में कोई परिभाषा के बिना एक आभासी फ़ंक्शन की घोषणा करेंगे।

उदाहरण के लिए:

 class Base { virtual void method1(); // throws undefined reference error. } 

उपरोक्त घोषणा को नीचे से बदलें, यह ठीक काम करेगा।

 class Base { virtual void method1() { } } 

मेरे मामले में समस्या तब हुई जब मैं अपने शुद्ध आभासी वर्ग में एक समारोह में = 0 जोड़ना भूल गया। यह तय किया गया था जब = 0 जोड़ा गया था। ऊपर के फ्रैंक के लिए भी यही है

 class ISettings { public: virtual ~ISettings() {}; virtual void OKFunction() =0; virtual void ProblemFunction(); // missing =0 }; class Settings : ISettings { virtual ~Settings() {}; void OKFunction(); void ProblemFunction(); }; void Settings::OKFunction() { //stuff } void Settings::ProblemFunction() { //stuff } 

मैं इस मुद्दे पर अब भी ठोकर खाई, बहुत एप्लिकेशन ने एक शुद्ध आभासी इंटरफ़ेस क्लास को परिभाषित किया और एक साझा-लिब के माध्यम से प्रदान की जाने वाली एक उपयोगकर्ता परिभाषित कक्षा इंटरफ़ेस को कार्यान्वित करने वाला था। आवेदन को जोड़ने पर, लिंकर ने शिकायत की कि साझा लिब बेस क्लास के लिए वीटेल और टाइप_इनफ़ोर्ड प्रदान नहीं करेगा, और न ही कहीं और भी मिल सकता है। पता चला कि मैं केवल एक इंटरफ़ेस के तरीकों को शुद्ध आभासी बनाने में भूल गया था (यानी घोषणा के अंत में "= 0" छोड़ा.बहुत अल्पविकसित, अभी भी अनदेखी और समझने में आसान है अगर आप लिंकर डायग्नोस्टिक को कनेक्ट नहीं कर सकते मूल कारण।

क्यू के साथ चीजों की तरह "हैलो वर्ल्ड" का प्रयास करते समय मुझे यह त्रुटि संदेश मिला था समस्याओं को ठीक से qt moc (मेटा ऑब्जेक्ट कंपाइलर) चलाने और इन एमओसी-जनरेटेड फ़ाइलों को सही ढंग से + संकलन करके चला गया

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

मैं इसे भविष्य के आगंतुकों के लिए डाल दिया:

यदि आप Exception ऑब्जेक्ट बनाने में त्रुटि प्राप्त कर रहे हैं, तो इसके कारण शायद यह है what() वर्चुअल फ़ंक्शन के लिए परिभाषा की कमी है।