3

リリース モードで Qt 4.8 を使用して Windows 7 でプロジェクトをコンパイルしているときに問題が発生しました。デバッグではすべて正常に動作しますが、リリースでは未処理の例外が発生します: 0xC0000005: アクセス違反。

これが発生する行、つまりピクセル バッファーを生成する行に絞り込みました。私の最初の推測では、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);
        ...
}

繰り返しますが、これはデバッグでうまく機能します。これがリリース時にのみ発生するのはなぜですか?

4

1 に答える 1

4

わかった。この問題はこれに関連しているようです: https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build

関連するバグレポートもあります: 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 ヘッダーの前に含まれていることを確認してください。そうしないと、コンパイル エラーが発生します。

于 2012-04-19T23:12:44.513 に答える