如何在 Qt 中使用 GLEW?

Posted

技术标签:

【中文标题】如何在 Qt 中使用 GLEW?【英文标题】:How to use GLEW with Qt? 【发布时间】:2010-11-19 13:44:20 【问题描述】:

我想在 Windows 下将 GLEW 与 Qt 一起使用(如果需要,请使用 7)。

我所做的是去 GLEW 网站,下载 windows 包,然后将 glew.dll 放在 System32 文件夹中。在我的 pro 文件中,我使用 LIBS += .../path_to_the_libs/glew32.lib 引用了 .lib 文件,glew32s.lib 也是如此(不确定后者的用途)。在我的 QGLWidget 子类中,我确保 glew.h 包含在 <QGLWidget> 之前,因此在 gl.hglu.h 之前。在main() 函数中,我做的第一件事是调用glewInit 并调用glGetError,但我的应用程序以一些奇怪的代码退出,比如一个非常大的负数。

我怀疑我做错了很多事情(我对 Qt 和 OpenGL 相对较新,对 GLEW 完全陌生),但我也怀疑主要错误之一是库,我假设,是用 MSVC 构建的,因此不能与 MinGW 链接......无论如何,任何人都可以提供如何使用 Qt 安装 GLEW 并使用它的分步说明吗?我将不胜感激。提前谢谢你

编辑: 伙计们,也许我要求太多了,但我真的很想要一步一步的指导:)

【问题讨论】:

不是glew32s.lib静态版本吗?你需要一个库,而不是两个。 如果编译器真的不同,你必须自己编译 GLEW。 通过 MSVC 编译的 GLEW 应该可以在 MinGW 上运行。 MinGW 具有某种与 MSVC 编译的 C 库链接的能力(虽然不是 C++)。我之前遇到过一些问题,但我可以确认 glew32s.lib 链接并仅与链接器命令上的 -lglew32s 一起使用,不需要黑客攻击。 【参考方案1】:

在您准备好 OpenGL 上下文之前,您不应该调用 glewInit()。在您第一次调用gl* 之前调用它,而不是在main 的开头。这应该可以解决问题。

另外,不要同时使用glew32.libglew32s.lib - 前者与 DLL 文件一起使用,后者是静态的(您的 .exe 变得更大,但您不必分发您的应用程序.dll)。决定并使用任何一个。

【讨论】:

这帮助很大!对于 QGLWidget 的重新实现者:调用 glewInit() 的最佳位置是在 initializeGL() 函数的顶部。这导致glewInit()为您创建的每个 GL 小部件调用,但这似乎不会打扰任何事情。【参考方案2】:

Qt 4.7 可以创建任何 OpenGL 上下文。使用 QGLFormat.setProfile() 和 QGLFormat.setVersion()

唯一的缺点是您仍然没有 OpenGL 3+ 绑定。

逐步解决方案:

    创建 QGLWindget 的新子类。 在新类的构造函数中使用正确的 OpenGL 编号设置新的 QGLContext。 调用 glewInit()。 将上下文传递给构造函数 QGLWidnet。

如果我没记错的话应该可以! GLEW dll 应放置在适当的系统文件夹中,并附加编译器选项,但它们与没有 QT 的 GLEW 相同。

【讨论】:

如何在没有 GLEW 的情况下访问 Opengl 3 相关的 API 调用? 现在,这是不同的问题!

以上是关于如何在 Qt 中使用 GLEW?的主要内容,如果未能解决你的问题,请参考以下文章

Qt4和GLew似乎互不兼容

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

Qt 和 GLEW:程序以代码 -1073741515 退出

Qt Creator 中的 Glew 链接问题?

将 GLEW 与 QOpenGLWidget 一起使用

Linux QT GCC OpenGL GLEW - 向编译器添加参数