2015-11-05 5 views
6

मैंने क्यूटी 5.5.1 के साथ एक सरल ओपनजीएल ऐप बनाने की कोशिश की, और जब तक मैं glClearColor जैसे openGL देशी फ़ंक्शन कॉल का उपयोग करने का प्रयास नहीं करता तब तक सब कुछ ठीक हो जाता है।क्यूटी 5.5 QOpenGLWidget लिंक त्रुटि किसी भी ओपनजीएल कॉल को जोड़ने से नहीं

विजेट वास्तव में संकलित करता है तथा एक काली स्क्रीन पैदा करता है, लेकिन उसके बाद मैं किसी भी ओपन देशी समारोह तो यह और भी लिंक नहीं है इस्तेमाल करने की कोशिश, लेकिन त्रुटि पैदा करता है:

glwidget.cpp:10: error: undefined reference to '[email protected]'

यहाँ .pro है फ़ाइल:

  QT  += core gui opengl 

      CONFIG += windows 

      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

      TARGET = Vehicle_simulation 

      TEMPLATE = app 

      SOURCES += main.cpp\ 
        simulation.cpp \ 
       glwidget.cpp 

      HEADERS += simulation.h \ 
       glwidget.h 

      FORMS += simulation.ui 

मैं डेस्कटॉप क्यूटी mingw492_32 किट का उपयोग कर रहा हूं। अजीब बात यह है कि मुझे lib फ़ोल्डर में libQtOpenGL.so नहीं मिला। क्या मेरा क्यूटी इंस्टॉलेशन दोषपूर्ण है? मैंने इसे कई बार पुनर्स्थापित करने का प्रयास किया, लेकिन इससे मदद नहीं मिली। मैं उस विशिष्ट पुस्तकालय को कहां डाउनलोड कर सकता हूं?

इसे परियोजना से जोड़ने से समस्या हल हो जाएगी, लेकिन मुझे इसे कहीं भी नहीं मिल रहा है।

समस्या यह है कि ओपनजीएल मॉड्यूल QT स्थापना से अनुपलब्ध है, यह नहीं है कि मैं उससे लिंक करने में असमर्थ हूं।

+0

@genpfault, picky नहीं, लेकिन डुप्लिकेट सुझाव गलत है। मुझे समस्या का स्रोत मिला और ऐसा इसलिए है क्योंकि क्यूटी डिफ़ॉल्ट रूप से एंगल के साथ बनाता है, जो केवल ओपनजीएल ईएस का समर्थन करता है, डेस्कटॉप ओपनजीएल नहीं। इसे हल करने के लिए मुझे इसमें ओपनजीएल के साथ क्यूटी कोर का कस्टम निर्माण करना है। यदि कोई इस समस्या का सामना कर रहा है तो सवाल का जवाब देने में मुझे खुशी होगी। –

+0

एक ओपनजीएल प्रोजेक्ट खोलने के बाद जो संकलित और लिंक किया गया है, मुझे समस्या का स्रोत मिला, यह एक लिंकिंग त्रुटि नहीं है, मैंने जीएलडब्लूजेट के गलत कार्यान्वयन का उपयोग किया है, जैसे ही मैं इसे पर्याप्त विचार संकलित कर सकता हूं, मैं अपना उत्तर पोस्ट करूंगा । –

उत्तर

8

मौके से एक उदाहरण कार्यक्रम खोलने के बाद, केवल कार्यान्वयन पर नज़र डालने के लिए; मैंने पाया कि एक ही उदाहरण के लिए QOpenGLWidget लागू किया गया है।

कुछ विश्लेषण के बाद मैंने समस्या का पता लगाने में कामयाब रहे।

क्यूटी में आंतरिक ओपनजीएल कार्यान्वयन और देशी ओपनजीएल समर्थन भी है। जिस विजेट का मैंने QOpenGLWidget से विरासत में उपयोग किया था, लेकिन ओपनजीएल फ़ंक्शन कॉल (जैसे glClearColor) ने क्यूटी में देशी ओपनजीएल कार्यान्वयन तक पहुंचने का प्रयास किया। जो कि मेरे क्यूटी निर्माण में शामिल नहीं थे, इसलिए परियोजना का निर्माण नहीं होगा।

इसे ठीक करने के लिए या तो कस्टम क्यूटी कोर बिल्ड चलाने या क्यूटी द्वारा प्रदान किए गए ओपनजीएल रैपर का उपयोग करना होगा।

मैंने अंत में क्यूटी रैपर का उपयोग किया, जिसका प्रयोग उदाहरण प्रोग्राम Cube द्वारा किया गया था। कक्षा को कार्यान्वित करने के लिए उपयोग किया जाने वाला वर्ग (जिसे मेरे कार्यान्वयन में GLWidget कहा जाता है) को न केवल QOpenGLWidget से, बल्कि QOpenGLFunctions से भी उत्तराधिकारी होना है। उत्तरार्द्ध भाग मेरे कार्यान्वयन से गायब था।

glwidget.h (प्रारंभिक):

#ifndef GLWIDGET_H 
#define GLWIDGET_H 


#include <QOpenGLFunctions> 
#include <QOpenGLWidget> 

class GLWidget : public QOpenGLWidget 
{ 
    Q_OBJECT 

public: 
    explicit GLWidget(QWidget *parent); 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int w, int h); 
}; 

#endif // GLWIDGET_H 

glwidget.h (निर्धारित):

#ifndef GLWIDGET_H 
#define GLWIDGET_H 


#include <QOpenGLFunctions> 
#include <QOpenGLWidget> 

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
    Q_OBJECT 

public: 
    explicit GLWidget(QWidget *parent); 

protected: 
    void initializeGL() Q_DECL_OVERRIDE; 
    void paintGL() Q_DECL_OVERRIDE; 
    void resizeGL(int w, int h) Q_DECL_OVERRIDE; 
}; 

#endif // GLWIDGET_H 

सावधान रहें इसके लिए स्रोत कोड निम्नलिखित है!

किसी भी ग्ल * फ़ंक्शन का उपयोग करने से पहले फ़ंक्शन initializeOpenGLFunctions(); को कॉल करना होगा, अन्यथा एक बहुत ही क्रिप्टिक रन-टाइम त्रुटि पॉप अप हो जाएगी। यानी .:

void GLWidget::initializeGL(){ 
    initializeOpenGLFunctions(); 
    glClearColor(1,0,0,1); 
} 

आशा इस किसी और रूप में अच्छी तरह मदद मिलेगी।

+0

धन्यवाद। यह मदद करता है। कृपया संदर्भ स्रोत जोड़ने पर भी विचार करें। – Tauqir

+0

मदद की खुशी है! एक संदर्भ निम्नलिखित प्रश्न होगा: http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls - वहां से मैं उत्सुक था उत्सुक था कक्षाओं का इस्तेमाल किया, स्रोत में देखा, और काम करने तक विभिन्न प्रयासों की कोशिश की। –

+1

5 से पहले क्यूटी के संस्करणों में निर्माण में ओपनजीएल के लिए निर्यात लाइब्रेरी शामिल थी, क्यूटी 5 स्वयं का रैपर है जो प्रदर्शन पर सिद्धांत के आधार पर बनाया गया है, इसलिए आप क्लास विधियों या रैपर को लाइब्रेरी फ़ंक्शन के बजाय कॉल करते हैं। दोनों दृष्टिकोणों में गुण है – Swift

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