Неопределенная ссылка на методы glew в проекте Qt

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

Я скачал 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);
}

.про файл:

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, которые я использовал. Любой ответ приветствуется.


person Dimitris jim    schedule 11.01.2017    source источник


Ответы (1)


Если вы используете 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.

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

person rgmt    schedule 11.01.2017
comment
Большое спасибо, этот код работает отлично, я очень ценю это. - person Dimitris jim; 11.01.2017