【问题标题】:openGL - Access Violation when calling glMatrixMode(...)openGL - 调用 glMatrixMode(...) 时访问冲突
【发布时间】:2016-06-22 03:01:44
【问题描述】:

我目前正在使用 SDL 1.2.4 和 C++Builder 10.0 Seattle。我已经设置了一个简单的测试程序来检查一切是否正常。

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

Exception-Klasse $C0000005 mit Meldung '在 0x68cc46f5 的访问冲突:读取地址 0x00001701'。 Prozes 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 似乎是这里的问题。

【问题讨论】:

  • 你能检查一下调用SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);是否真的成功了。在此处查看示例:libsdl.org/release/SDL-1.2.15/docs/html/sdlglsetattribute.html
  • 也许 SDL 使用带有核心配置文件的现代 OpenGL3 上下文。不推荐使用的函数,包括矩阵,被删除,所以 glMatrixMode 的函数指针为 NULL(这解释了访问冲突)。

标签: c++ opengl sdl c++builder c++builder-10-seattle


【解决方案1】:

如果有人通过谷歌找到这个帖子:

我为 Borland 编译器下载了 opengl32.lib 和 gl32.lib。 这些文件显然被破坏了。不知道来源了,但在使用名为 bc_libs.zip 的文件时要小心

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

【讨论】:

  • *.lib 可以是*.dll 或静态库的链接文件(类似于*.obj)。 Borland 使用 Intel 格式的链接文件,而 Microsoft 使用它自己的(参见 OMF/COMF 差异)。因此,如果您使用了错误格式的链接文件,或者如果您将库用作 dll 链接文件,反之亦然,那么您就会遇到问题。 Borland 有自己的库,存储在#include <gl\gl.h> 中,将正确的东西链接到应该的位置(除非您更改包含路径或 BCB 安装文件)。通常,如果您在任何其他库(如 SDL)之前包含它,它应该覆盖来自基于 MS 的库的错误链接。
  • 还有一些库需要添加一个特定的#define 宏或包含设置以在 Borland 环境中使用。见Setting up OpenGL in Borland C++How to render an openGL frame in C++ builder?
猜你喜欢
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多