在Qt项目中出现的未定义glew方法的引用

3

我在使用Qt 5.1.0中的OpenGL时遇到了严重的问题。我的编译器是MinGW 32位,我使用的是Windows10 64位。我试图创建一个包含OpenGL小部件的主窗口。在这个OpenGL小部件中,我尝试绘制一个三角形。

我已经下载了glew1.9.0(因为glew-2.0.0下载给了我一个空的lib文件夹)。我已经包含了静态库glew32s.lib(而不是动态的.dll)。我添加了#define GLEW_STATIC#include <gl/glew.h>。我还在我的.pro文件中添加了库路径、关于链接的库以及包含路径的信息。

但是我仍然无法找到所有在glew.h中包含的函数的定义。实际上,我注意到,尽管我使用了例如glGenBuffers(),但我收到了__glewGenBuffers()的消息。在gl.glew.h中,我发现定义glGenBuffers的行调用了未定义的__glewGenBuffers()

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

那么,问题可能是在glew.h中调用了__glewGenBuffers但尚未定义吗?我的意思是,我有什么遗漏吗?我已经尝试了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 函数都是一样的。 欢迎任何答案。
1个回答

2
如果您使用Qt,应该不要使用glew:因为Qt提供了OpenGL函数的封装,所以最好情况下它将是无用的。因此,如果您真的想手动完成工作,请使用Qt类,如QOpenGLBufferQOpenGLFunctions。请注意保留HTML标签。
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);
}

为了充分回答您的问题,您的“未定义引用”错误可能是由于 glew 包提供的 glew32s.lib 是为 MSVC 编译而非 MinGW。

除非您确定在项目中使用与编译依赖项相同的编译器,否则最好的方法是从源代码编译自己的版本。



非常感谢,这段代码运行得很好,我真的很感激。 - Dimitris jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接