2017-01-11 2 views
3

У меня есть серьезная проблема при использовании opengl в Qt 5.1.0. Мой компилятор MinGW 32 бит, и я использую Windows10 64 бит. Я пытаюсь создать главное окно, содержащее виджет OpenGL. В этом виджетах OpenGL я пытаюсь нарисовать треугольник.Неопределенная ссылка на методы glew в проекте Qt

Я загрузил glew1.9.0 (потому что загрузка glew-2.0.0 дает мне пустую папку lib). Я включил статические библиотеки glew32s.lib (не динамический .dll). Я добавил #define GLEW_STATIC и #include <gl/glew.h>. Я также добавил путь lib и информацию о библиотеках для ссылки, а также путь включения в мой файл .pro.

Но все же я получаю неопределенные ссылки для всех функций, включенных в 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 

Послание:

undefined ссылка на '__glewGenBuffers'

То же самое для всех функций glew, которые я использовал. Любой ответ приветствуется.

ответ

2

Если вы используете Qt, вы должны не использовать glew: в лучшем случае это будет бесполезно, поскольку Qt предоставляет инкапсуляции для функций OpenGL. Поэтому использовать классы Qt, как QOpenGLBuffer или QOpenGLFunctions, если вы действительно хотите, чтобы сделать работу «вручную»:

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); 
} 

Чтобы полностью ответить на ваш вопрос, ваш «неопределенную ссылка "может быть вызвана glew32s.lib с пакетом glew, который скомпилирован для MSVC, а не MinGW.

Если вы не используете один и тот же компилятор в своем проекте, чем тот, который используется для компиляции зависимостей, наилучшим подходом является компиляция вашей собственной версии из источников.

+0

Большое спасибо, этот код работает отлично, я очень ценю его. –

Смежные вопросы