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

Posted

技术标签:

【中文标题】Qt 项目中对 glew 方法的未定义引用【英文标题】:Undefined reference to glew methods in a Qt project 【发布时间】:2017-01-11 09:51:45 【问题描述】:

我在 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 中包含的所有函数,我仍然得到未定义的引用。实际上我注意到虽然我正在使用例如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 函数都是一样的。 欢迎任何答案。

【问题讨论】:

【参考方案1】:

如果您使用的是 Qt,则应该使用 glew:因为 Qt 为 OpenGL 函数提供了封装,所以它充其量是没有用的。因此,如果您真的想“手动”完成工作,请使用 Qt 类,例如 QOpenGLBufferQOpenGLFunctions

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


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

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

【讨论】:

非常感谢,这段代码运行良好,非常感谢。

以上是关于Qt 项目中对 glew 方法的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

对 glew 的未定义引用 [重复]

Travis CI 上的 Boost 中对 `std::__cxx11::basic_string 的未定义引用

linux makefile中对函数的未定义引用

c 中对“getline”的未定义引用

c++中对静态变量的未定义引用

Linux 中对 pthread_create 的未定义引用