Qt 5.5 QOpenGLWidget链接错误未链接任何openGL调用

Posted

技术标签:

【中文标题】Qt 5.5 QOpenGLWidget链接错误未链接任何openGL调用【英文标题】:Qt 5.5 QOpenGLWidget link error not linking any openGL calls 【发布时间】:2015-11-05 16:56:58 【问题描述】:

我尝试使用 Qt 5.5.1 构建一个简单的 OpenGL 应用程序,一切都很好,直到我尝试使用诸如 glClearColor 之类的 openGL 本机函数调用。

小部件实际上编译并产生黑屏,但在我尝试使用任何 openGL 原生函数后,它甚至没有链接,而是产生错误:

glwidget.cpp:10: error: undefined reference to '_imp__glClearColor@16'

这是 .pro 文件:

            QT       += core gui opengl

            CONFIG   += windows

            greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

            TARGET = Vehicle_simulation

            TEMPLATE = app

            SOURCES += main.cpp\
                    simulation.cpp \
                glwidget.cpp

            HEADERS  += simulation.h \
                glwidget.h

            FORMS    += simulation.ui

我正在使用 Desktop Qt mingw492_32 套件。 奇怪的是,我没有在 lib 文件夹中找到 libQtOpenGL.so。我的 QT 安装有问题吗?我尝试多次重新安装它,但它没有帮助。我在哪里可以下载那个特定的库?

将它链接到项目可以解决问题,但我似乎无法在任何地方找到它。

问题是 QT 安装中缺少 openGL 模块,不是我无法链接到它。

【问题讨论】:

@genpfault ,不要挑剔,但重复的建议是错误的。我找到了问题的根源,这是因为 QT 默认使用 ANGLE 构建,它只支持 openGL ES,不支持桌面 openGL。为了解决这个问题,我必须在其中使用 openGL 自定义构建 QT Core。如果有人遇到这个问题,我会非常乐意回答这个问题。 打开编译链接的示例openGL项目后,我找到了问题的根源,不是链接错误,我使用了错误的GLWIdget实现,我会尽快发布我的答案我可以编译足够的想法。 【参考方案1】:

偶然打开了一个示例程序,只是为了看一下实现;我发现同样的QOpenGLWidget 已经在一个新的示例程序中实现了。

经过一番分析,我设法找出了问题所在。

QT 有一个内部的 openGL 实现和原生的 openGL 支持。我使用的小部件继承自QOpenGLWidget,但openGL 函数调用(如glClearColor)试图访问Qt 中的本机openGL 实现。由于这些不包含在我的 Qt 构建中,因此该项目不会构建。

要解决这个问题,必须运行自定义 Qt 核心构建,或者使用 Qt 提供的 openGL 包装器。

最后我使用了 Qt 包装器,示例程序Cube 也使用了它。用于实现小部件的类(在我的实现中称为GLWidget)不仅要继承自QOpenGLWidget,还要继承自QOpenGLFunctions。我的实施中缺少后一部分。它的源代码如下:

glwidget.h(初始):

#ifndef GLWIDGET_H
#define GLWIDGET_H


#include <QOpenGLFunctions>
#include <QOpenGLWidget>

class GLWidget : public QOpenGLWidget

    Q_OBJECT

public:
    explicit GLWidget(QWidget *parent);

protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);
;

#endif // GLWIDGET_H

glwidget.h(固定):

#ifndef GLWIDGET_H
#define GLWIDGET_H


#include <QOpenGLFunctions>
#include <QOpenGLWidget>

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions

    Q_OBJECT

public:
    explicit GLWidget(QWidget *parent);

protected:
    void initializeGL() Q_DECL_OVERRIDE;
    void paintGL() Q_DECL_OVERRIDE;
    void resizeGL(int w, int h) Q_DECL_OVERRIDE;
;

#endif // GLWIDGET_H

小心!

在使用任何 gl* 函数之前,必须调用函数 initializeOpenGLFunctions();,否则会弹出一个非常神秘的运行时错误。 即:

void GLWidget::initializeGL()
    initializeOpenGLFunctions();
    glClearColor(1,0,0,1);

希望这对其他人也有帮助。

【讨论】:

谢谢。它有帮助。请考虑添加参考源。 很高兴能帮上忙!一个参考是以下问题:***.com/questions/31688370/… - 从那里我很好奇看到它使用的类,查看源代码,并尝试了各种尝试,直到它起作用。 5 之前的 qt 版本将 opengl 的导出库包含在构建中,qt5 确实拥有自己的包装器,该包装器是根据性能原则正确构建的,因此您调用类方法或包装器而不是库函数。两种方法都有优点

以上是关于Qt 5.5 QOpenGLWidget链接错误未链接任何openGL调用的主要内容,如果未能解决你的问题,请参考以下文章

带有 QOpenGLWidget 的 Qt 5.5,核心配置文件中的不可见三角形

Qt 5.5 和 OpenGL:检索设备信息

在qt的QOpenGLWidget开启opengl的抗锯齿

加不了openglwidget

将 GLEW 与 QOpenGLWidget 一起使用

Qt 5.5:未安装模块“QtAudioEngine”