2016-03-08 107 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