2017-01-11 6 views
3

Qt 5.1.0でopenglを使用する際に重大な問題があります。私のコンパイラはMinGW 32ビットで、私はWindows 10 64ビットを使用します。 OpenGLウィジェットを含むメインウィンドウを作成しようとしています。このOpenGLウィジェットでは、三角形を描画しようとしています。Qtプロジェクトのglewメソッドへの未定義の参照

私はglew1.9.0をダウンロードしました(glew-2.0.0ダウンロードで空のlibフォルダが得られたため)。私は静的ライブラリglew32s.lib(動的ではありません.dll)を含んでいます。私は#define GLEW_STATIC#include <gl/glew.h>を追加しました。私はまた、libパスと、私の.proファイルのincludeパスとリンクするライブラリに関する情報を追加しました。

しかし、私はglew.hに含まれるすべての機能について未定義のリファレンスを取得しています。実際に私は気づいていますが、 glGenBuffers()__glewGenBuffers()のメッセージが表示されます。内部にgl.glew.h、私はその行を見つけました。glGenBuffers is defined, calls __glewGenBuffers`はまだ定義されていません。

1685 #define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) 
14376 GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; 

ので、問題は__glewGenBuffersと呼ばれるが、glew.hではまだ定義されていないということだろうか?私はここで嫌な思いをしていますか?私は今2日間しようとしている、私はすべての同様の投稿に投稿してみましたが、私は解決策を見つけることができません。ここ

コードの小さいが代表的な部分である:

glwidget.cpp:

#define GLEW_STATIC 
#include <gl/glew.h> 
#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent) : 
    QGLWidget(parent) 
{ 

} 

extern "C" void GLWidget::initializeGL() 
{ 
    glewInit(); 
    glClearColor(0, 1, 0, 1); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_COLOR_MATERIAL); 
    GLfloat verts[] = 
    { 
     +0.0f, +1.0f, 
     -1.0f, -1.0f, 
     +1.0f, -1.0f, 
    }; 
    GLuint myBufferID; 
    glGenBuffers(1, &myBufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, myBufferID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); 

} 

void GLWidget::resizeGL(int w, int h) 
{ 
} 

void GLWidget::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
} 

.PROファイル:

QT  += core gui opengl 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = New_Beam 
TEMPLATE = app 


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

HEADERS += mainwindow.h \ 
    glwidget.h \ 
    ../../../../../Qt/Qt5.3.2/glew-1.9.0/include/GL/glew.h 

FORMS += mainwindow.ui 

win32: LIBS += -L"C:/Qt/Qt5.3.2/glew-1.9.0/lib" -lglew32s -lopengl32 

INCLUDEPATH += C:/Qt/Qt5.3.2/glew-1.9.0/include 
DEPENDPATH += C:/Qt/Qt5.3.2/glew-1.9.0/include 

メッセージは次のとおり

'__glewGenBuffers'への未定義の参照

私が使用したすべてのglew関数と同じです。 答えは歓迎です。

答えて

2

Qtを使用している場合は、ではありません。はglewを使用してください。QtはOpenGL関数のカプセル化機能を提供しています。

class GLWidget : public QGLWidget, protected QOpenGLFunctions 
{ 
    // ... 
}; 

と実装:

#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent) : 
    QGLWidget(parent) 
{ 

} 

void GLWidget::initializeGL() 
{ 
    initializeOpenGLFunctions(); 
    glClearColor(0, 1, 0, 1); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_COLOR_MATERIAL); 
    GLfloat verts[] = 
    { 
     +0.0f, +1.0f, 
     -1.0f, -1.0f, 
     +1.0f, -1.0f, 
    }; 
    GLuint myBufferID; 
    glGenBuffers(1, &myBufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, myBufferID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); 

} 

void GLWidget::resizeGL(int w, int h) 
{ 
} 

void GLWidget::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
} 

は完全にあなたの質問に答えるために、あなたの「未定義のあなたは本当に「手動」の仕事をしたいのであればQOpenGLBufferまたはQOpenGLFunctionsのようなQtのクラスを使用します「参照」エラーは、MinGWではなくMSVC用にコンパイルされたglewパッケージで提供されているglew32s.libによって引き起こされる可能性があります。

依存関係をコンパイルするために使用したのと同じコンパイラをプロジェクトで使用するのが確実でない場合は、ソースから独自のバージョンをコンパイルすることをお勧めします。

+0

ありがとう、このコードはうまくいきます、本当にありがとうございます。 –

関連する問題