c++ - 未定义对 Qt 项目中 glew 方法的引用

标签 c++ qt opengl linker-errors glew

我在 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 中添加了 lib 路径和有关要链接的库的信息以及包含路径。文件。

但是对于 glew.h 中包含的所有函数,我仍然得到 undefined reference .其实我已经注意到,虽然我正在使用例如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 reference to '__glewGenBuffers'

我用过的所有 glew 函数都一样。 欢迎任何答案。

最佳答案

如果您正在使用 Qt,您应该使用 glew:充其量它也没什么用,因为 Qt 提供了对 OpenGL 函数的封装。所以使用像 QOpenGLBuffer 这样的 Qt 类或 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);
}

为了完整回答您的问题,您的“ undefined reference ”错误可能是由为 MSVC 而不是 MinGW 编译的 glew 包提供的 glew32s.lib 引起的。

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

关于c++ - 未定义对 Qt 项目中 glew 方法的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41587535/

相关文章:

c++ - 在 OSX 中针对 OpenGL 和 Xm 编译 C/C++ 应用程序

c++ - 为什么我的程序不检查位域成员的值,即使有 "if"语句?

c++ - 客户端断开连接时 TCP 套接字选择服务器段错误

python - 在 OpenGL 中近似一个球体

c++ - 当设置中/MT 时程序可以运行,但当/MD 时程序会失败

c++ - 如何在Qt5中的小部件上画一条线

qt - 如何声明多个 QML 属性而不单独处理每个属性?

qt - OpenCv QT CvNamedWindow IplImage不起作用

opengl - 是否有可能破解 GTK 渲染到 OpenGL 纹理

opengl - 是否有 acos() 函数的精确近似值?