2015-11-05 170 views
6

我试图用Qt 5.5.1构建一个简单的OpenGL应用程序,并且一切都很好,直到我尝试使用像glClearColor这样的openGL本机函数调用。Qt 5.5 QOpenGLWidget链接错误没有链接任何openGL调用

窗件实际上编译并产生黑屏,但之后,我尝试使用它,甚至不链接任何openGL的原生功能,但产生错误:

glwidget.cpp:10: error: undefined reference to '[email protected]'

这里是的.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 

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

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

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

+0

@genpfault,不挑剔,但重复的建议是错误的。我发现问题的根源,这是因为默认情况下,QT使用ANGLE创建,ANGLE只支持openGL ES,而不支持桌面openGL。为了解决这个问题,我必须在其中使用openGL进行QT Core的定制构建。如果有人遇到这个问题,我会更乐意回答这个问题。 –

+0

打开一个编译和链接的示例openGL项目后,我发现问题的来源,它不是链接错误,我使用了GLWIdget的错误实现,只要我能够编译足够的思想,就会发布我的答案。 –

回答

8

之后我偶然打开了一个示例程序,只是看看实现;我发现在新的示例程序中已经实现了相同的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); 
} 

希望这会帮助别人也是如此。

+0

谢谢。它有帮助。请考虑添加参考源。 – Tauqir

+0

很高兴为您服务!一个参考将是以下问题:http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls - 从那里我很好奇,看到它使用的类,查看源代码,并尝试各种尝试,直到它的工作。 –

+1

qt之前版本的5包含了将opengl的导出库包含到构建中,qt5通过原则正确性构建了自己的包装器,因此您可以调用类方法或包装器,而不是库函数。这两种方法都有美德 – Swift