2015-11-05 117 views
6

我試圖用Qt 5.5.1構建一個簡單的OpenGL應用程序,並且一切都很好,直到我嘗試使用像glClearColor這樣的openGL本機函數調用。Qt 5.5 QOpenGLWidget鏈接錯誤沒有鏈接任何openGL調用

窗件實際上編譯併產生黑屏,但之後,我嘗試使用它,甚至不鏈接任何openGL的原生功能,但產生錯誤:

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 

我正在使用桌面Qt mingw492_32套件。 但奇怪的是,我沒有在lib文件夾中找到libQtOpenGL.so。我的QT安裝有問題嗎?我試圖重新安裝它多次,但它沒有幫助。我在哪裏可以下載特定的圖書館?

將其鏈接到項目將解決問題,但我似乎無法在任何地方找到它。

問題是從QT安裝缺少的OpenGL模塊,它不是,我無法鏈接到它。

+0

@genpfault,不挑剔,但重複的建議是錯誤的。我發現問題的根源,這是因爲默認情況下,QT使用ANGLE創建,ANGLE只支持openGL ES,而不支持桌面openGL。爲了解決這個問題,我必須在其中使用openGL進行QT Core的定製構建。如果有人遇到這個問題,我會更樂意回答這個問題。 –

+0

打開一個編譯和鏈接的示例openGL項目後,我發現問題的來源,它不是鏈接錯誤,我使用了GLWIdget的錯誤實現,只要我能夠編譯足夠的思想,就會發布我的答案。 –

回答

8

之後我偶然打開了一個示例程序,只是看看實現;我發現在新的示例程序中已經實現了相同的QOpenGLWidget

經過一些分析,我設法弄清楚了這個問題。

QT有一個內部的openGL實現和原生的openGL支持。我使用的小工具繼承自QOpenGLWidget,但openGL函數調用(如glClearColor)試圖訪問Qt中的本機OpenGL實現。由於這些不包含在我的Qt構建中,因此該項目無法構建。

要解決這個問題,必須運行定製的Qt內核構建,或者使用Qt提供的openGL包裝器。

我最後使用了Qt包裝,它也被示例程序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 

要小心!

在使用任何gl *函數之前,函數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

qt之前版本的5包含了將opengl的導出庫包含到構建中,qt5通過原則正確性構建了自己的包裝器,因此您可以調用類方法或包裝器,而不是庫函數。這兩種方法都有美德 – Swift