2016-03-08 63 views
0

我目前使用SDL 1.2.4和C++ Builder 10.0 Seattle。我已经建立了一个简单的测试程序来检查一切是否正常工作。openGL - 调用glMatrixMode时访问冲突(...)

下面的代码编译没有警告或错误,但给了我一个运行时错误:

Exception-Klasse $C0000005 mit Meldung 'access violation at 0x68cc46f5: read of address 0x00001701'. Prozess Project1.exe (2624)

int _tmain(int argc, _TCHAR* argv[]) { 

    SDL_Init(SDL_INIT_VIDEO); 
    SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(70,(double)640/480,1,1000); 

    while (true) { 
     SDL_PumpEvents(); 
    } 

    return 0; 
} 

如果我删除glMatrixMode(...),代码“作品”,这意味着会弹出一个窗口,但不显示任何内容。所以MatrixMode似乎是这里的问题。

+1

您可以检查是否调用'SDL_SetVideoMode(640,480,32,SDL_OPENGL);'实际上是成功的。请参阅此处的示例:https://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlglsetattribute.html – vcp

+1

也许SDL使用具有核心配置文件的现代OpenGL3上下文。包含矩阵的弃用函数被删除,因此glMatrixMode的函数指针为NULL(这解释了访问冲突)。 – Youka

回答

1

如果有人通过谷歌发现这个线程:

我下载opengl32.lib和gl32.lib Borland的编译器。 这些文件被明显中断。不知道来源了,但要谨慎使用名为bc_libs.zip

我使用windows/system32中的.dll自己创建了.lib文件。

+0

'* .lib'可以是'* .dll'或者一个静态库的链接文件(可以是'* .obj')。 Borland使用链接文件英特尔格式和微软使用它自己的(见OMF/COMF差异)。因此,如果您使用的链接文件格式不正确,或者将库用作dll链接文件,反之亦然,则会出现问题。 Borland有自己的库存储在'#include '链接它应该正确的东西(除非你改变包含路径或BCB安装文件)。通常如果你在任何其他lib(如SDL)之前包含它,它应该覆盖基于MS的libs的错误链接。 – Spektre

+0

也有些库需要添加一个特定的'#define'宏或包含在Borland环境中设置使用。参见[在Borland C++中设置OpenGL](http://stackoverflow.com/a/26177014/2521214)和[如何在C++ builder中渲染OpenGL框架?](http://stackoverflow.com/a/20679773/ 2521214) – Spektre