2015-11-05 10 views
6

Qt 5.5.1で単純なOpenGL Appを構築しようとしましたが、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でビルドされているからです。これは、OpenGL ESのみをサポートし、デスクトップのOpenGLはサポートしていないためです。これを解決するには、QT CoreのカスタムビルドをOpenGLで実行する必要があります。私は、誰かがこの問題に遭遇した場合に質問に答えることがうれしい。 –

+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

助けになるのはうれしい! 1つの参考資料は次の質問である:http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls - そこから私は好奇心が強い使用したクラスを調べ、ソースを調べ、それがうまくいくまでさまざまな試行を試みました。 –

+1

5の前のqtのバージョンは、OpenGLのビルドにエクスポートライブラリを含んでいました。qt5は、パフォーマンスよりも基本的な正しさによって構築された独自のラッパーを持っていますので、クラスメソッドまたはラッパーをライブラリ関数と呼びます。両方のアプローチに美徳があります – Swift

関連する問題