glGenBuffers 在发布版本中崩溃
glGenBuffers crashes in Release Build
我在OpenGL函数glGenBuffers()上遇到了一个奇怪的问题。我正在编写一个相当简单的应用程序,其中我使用按以下方式声明的 VBO:
#include <QGLFunctions>
#include <QGLWidget>
class MyClass : public QGLWidget, protected QGLFunctions {
GLuint vertexBufferObject;
// ...
GLuint makeBufferList(void);
}
GLuint MyClass::makeBufferList(void) {
vertexBufferObject = 0;
glGenBuffers(1, &vertexBufferObject); // <-- Here it crashes
// ... load data and render
return vertexBufferList;
}
MyClass::MyClass(QWidget* parent)
: QGLWidget(parent),
vertexBufferObject(0)
{
QGLContext* context = new QGLContext(this->format());
initializeGLFunctions(context);
glInit();
}
MyClass::~MyClass() {
glDeleteBuffers(1, &vertexBufferObject);
}
这一切都在调试版本中运行良好。数据呈现得很好,所有程序最终正确完成。但是,在发布版本中,glGenBuffers() 会使程序崩溃。它不只是返回 0 或不执行任何操作,它会在函数调用时崩溃。但由于问题仅在发布模式下出现,因此我无法使用调试器找出问题所在。
我正在开发Windows 7系统,并在Qt 4.8.1中开发。编译器是 MSVC 2010 (Qt SDK) 编译器。
有人有什么建议我可以尝试吗?
//编辑:
也许有用知道:我尝试使用GCC(Qt SDK)编译器在Mac上编译完全相同的代码,并且调试和发布构建都工作得很好。但在Windows 7上,问题仍然存在。
发现了问题(感谢@MahmoudFayez):问题来自Qt API中的一个错误,该错误使glGenBuffers()函数(可能还有其他函数)崩溃。这个问题直接等同于这里讨论的问题:
- 仅在发布模式下使用 glGenBuffer 的未处理异常 - QT
- http://qt-project.org/forums/viewthread/12794
解决方案相对简单,但不是很优雅:使用GLEW而不是QGLFunctions。 我通过以下方式解决了我的问题:
#include "glew.h"
#include <QGLWidget>
class MyClass : public QGLWidget {
// ...same as the above
}
MyClass::MyClass(QWidget* parent)
: QGLWidget(parent),
vertexBufferObject(0)
{
makeCurrent();
glewInit();
}
这解决了一切。缺点是这涉及使用额外的外部依赖项,而使用Qt就是尽可能兼容,尽可能少地使用外部依赖项。但是,我们似乎需要等到 Qt 5.0 发布后才能修复此错误。
作为最后的评论:我无法弄清楚此错误中的哪个部分只导致发布版本崩溃,而不是调试模式。
相关文章:
- OpenGL 在 VMWare Fusion 版本 10.1.3 上安装的虚拟机 (Ubuntu 16.04) 上崩溃
- 由于____chkstk_darwin,在Catalina上使用部署10.10编译的MacOS应用程序在HighSierra版本<崩溃
- 在官方 ZeroMQ 多线程示例的修改版本中崩溃
- Mongodb Cxx 驱动程序测试在发布版本中崩溃 [ 在调试中工作正常]
- 用静态版本的QT编译时,文件对话框崩溃
- Qt 网络引擎调试版本崩溃
- 调用64位C/C++DLL的C#应用程序崩溃,但运行32位版本
- 调试版本仅崩溃
- p = new String [0]和p = new Int [0]之后,为什么当删除[] p时字符串版本崩溃
- 由于msvcp120d.dll,发布版本崩溃
- 为什么我的.exe文件崩溃了,但在调试和发布版本中工作得很好
- glGenBuffers 在发布版本中崩溃
- 程序的守护程序版本崩溃时的查找位置
- PDB无法显示发布版本崩溃的确切行号,但在二进制调试版本的情况下显示精确行号
- 混合 mfc 对话框和 mdi 项目的调试版本中崩溃
- 如何调试仅在发布版本中发生的崩溃
- 我的调试版本dll使用了可重新分发和崩溃的发布版本
- /Visual Studio 2008中二进制崩溃的MT版本-如何调试
- 在发布版本中,iOS 5.1设备上的Xcode 5.1 std::字符串串联崩溃
- 程序只在发布版本构建时崩溃——如何调试