我在使用Qt 4.8在发布模式下在Windows 7上编译项目时遇到了一些麻烦。在Debug上一切正常,但在Release上我得到一个未处理的异常:0xC0000005:访问冲突。
我把它缩小到发生这种情况的行,这是我生成Pixel Buffers的时候。 我的第一个猜测是错误的DLL加载,但我检查了可执行文件与Dependency Walker并且每个加载的DLL都是正确的。
以下是我的一些代码:
class CameraView : public QGLWidget, protected QGLFunctions;
void CameraView::initializeGL()
{
initializeGLFunctions(this->context());
glGenBuffers(1, &pbo_); //<<<<< This is where I get the unhandled exception on Release mode
glBindBuffer(QGLBuffer::PixelUnpackBuffer, pbo_);
glBufferData(QGLBuffer::PixelUnpackBuffer, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
...
}
同样,这在调试时效果很好。为什么这只会在Release上发生?
答案 0 :(得分:4)
我明白了。 似乎这个问题与这个问题有关: https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build
并且还有一个错误报告可能也相关: https://bugreports.qt.io/browse/QTBUG-5729
也许初始化的GLFunctions()方法没有得到GL扩展函数的所有函数指针,我真的不知道为什么,但这似乎是它。
我的解决方案是停止使用Qt的GL扩展并开始使用glew。
所以,这对我有用:
#include <QtGui/QtGui>
#include <gl/glew.h>
#include <QtOpenGL/QGLWidget>
class CameraView : public QGLWidget;
void CameraView::initializeGL()
{
//initializeGLFunctions(this->context());
GLenum init = glewInit();
// Create buffers
glGenBuffers(1, &pbo_);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_);
glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
// Set matrixes
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrtho(0, this->width(), 0, this->height(), 0, 1);
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}
确保在任何QTOpenGL标头之前包含glew.h,否则您将收到编译错误。