我遇到了一些麻烦,而在发布模式使用Qt 4.8编写在Windows 7上我的项目。 一切正常的调试,但在释放我得到一个未处理的异常:0000005:访问冲突。
我把范围缩小到出现这种情况的线,这是当我生成我象素缓冲器。 我的第一个猜想是错误的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);
...
}
再次,这在调试的伟大工程。 为什么这只发生在释放?
我知道了。 好像这个问题涉及到这一块: https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build
并有可能也涉及一个bug报告: https://bugreports.qt.io/browse/QTBUG-5729
也许initializeGLFunctions()方法是没有得到的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);
}
确保glew.h之前任何QTOpenGL头包括否则你会得到一个编译错误。