2015-11-05 9 views
6

Ho provato a creare una semplice app OpenGL con Qt 5.5.1, e tutto va bene fino a quando non provo a utilizzare chiamate di funzioni native openGL come glClearColor.Qt 5.5 Errore link QOpenGLWidget che non collega alcuna chiamata openGL

Il Widget in realtà compila e produce una schermata nera, ma dopo cerco di utilizzare qualsiasi funzione nativa openGL lo fa neanche collegamento, ma produce l'errore:

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

Ecco la .pro file:

  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 

Uso il kit Qt Desktop Mingw492_32. La cosa strana è che non ho trovato libQtOpenGL.so nella cartella lib. La mia installazione QT è difettosa? Ho provato a reinstallarlo più volte, ma non è stato di aiuto. Dove posso scaricare quella libreria specifica?

che lo collega al progetto avrebbe risolto il problema, ma io non riesco a trovare da nessuna parte.

Il problema è il modulo openGL mancante dall'installazione QT, non è che non riesco a collegare ad esso.

+0

@genpfault, per non essere schizzinosi, ma il suggerimento duplicato è sbagliato. Ho trovato la fonte del problema ed è perché QT di default costruisce con ANGLE, che supporta solo OpenGL ES, non desktop openGL. Per risolvere questo devo fare una build personalizzata di QT Core con openGL. Sarei più che felice di rispondere alla domanda se qualcuno incontrasse questo problema. –

+0

Dopo aver aperto un progetto openGL di esempio compilato e collegato, ho trovato l'origine del problema, non si tratta di un errore di collegamento, ho usato l'implementazione errata di GLWIdget, posterò la mia risposta non appena riesco a compilare una riflessione sufficiente . –

risposta

8

Dopo aver aperto un programma di esempio per caso, solo per dare un'occhiata all'implementazione; Ho scoperto che lo stesso QOpenGLWidget è stato implementato in un nuovo programma di esempio.

Dopo un po 'di analisi sono riuscito a capire il problema.

QT ha anche un'implementazione openGL interna e il supporto openGL nativo. Il widget che ho usato ereditato da QOpenGLWidget, ma le chiamate di funzione openGL (come glClearColor) hanno tentato di accedere all'implementazione openGL nativa in Qt. dal momento che quelli non erano inclusi nella mia build Qt, il progetto non sarebbe stato costruito.

Per risolvere questo problema è necessario eseguire una compilazione di base Qt personalizzata oppure utilizzare il wrapper openGL fornito da Qt.

Ho utilizzato il wrapper Qt alla fine, che è stato utilizzato anche dal programma di esempio Cube. la classe utilizzata per implementare il widget (chiamata GLWidget nella mia implementazione) deve ereditare non solo da QOpenGLWidget, ma anche da QOpenGLFunctions. L'ultima parte mancava dalla mia implementazione. Il codice sorgente per esso è la seguente:

glwidget.h (iniziale):

#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 (fisso):

#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 

Fate attenzione!

Prima di utilizzare qualsiasi funzione gl *, è necessario chiamare la funzione initializeOpenGLFunctions();, altrimenti verrà visualizzato un errore di runtime molto criptico. cioè .:

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

Spero che questo vi aiuterà a qualcun altro pure.

+0

grazie. ha aiutato. per favore considera di aggiungere anche la fonte di riferimento. – Tauqir

+0

Felice di essere di aiuto! Un riferimento sarebbe la seguente domanda: http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls - Da lì ero curioso di vedere il classi usate, esaminate la fonte e provarono vari tentativi finché non funzionò. Le versioni –

+1

di qt precedenti alla 5 includevano la libreria di esportazione per opengl in build, qt5 ha un proprio wrapper costruito per principio sulla performance, quindi chiamate i metodi di classe o i wrapper piuttosto le funzioni di libreria. c'è virtù in entrambi gli approcci – Swift

Problemi correlati