OpenGL (GLUT) Absturz
-
Hallo,
ich hoffe, dass ist der richtige Forenbereich für folgende Frage.
Ich habe folgenden Code:int main (int argc,char ** argv) { HMODULE h_DLL_opengl32 = LoadLibrary ("opengl32.dll"); HMODULE h_DLL_glew32 = LoadLibrary ("glew32.dll"); HMODULE h_DLL_glu32 = LoadLibrary ("glu32.dll"); HMODULE h_DLL_glut32 = LoadLibrary ("glut32.dll"); // OpenGL - initialisieren typedef void (* function_0) (int *,char **); function_0 f_glutInit; f_glutInit = reinterpret_cast < function_0 > (GetProcAddress (h_DLL_glut32,"glutInit")); (* f_glutInit) (& argc,argv); cout << "\nOpenGL initialisiert"; // OpenGL - Anzeigemodus initialisieren typedef void (* function_1) (unsigned int); function_1 f_glutInitDisplayMode; f_glutInitDisplayMode = reinterpret_cast < function_1 > (GetProcAddress (h_DLL_glut32,"glutInitDisplayMode")); (* f_glutInitDisplayMode) (0|2|16); cout << "\nAnzeigemodus initialisiert"; // OpenGL - Fenstergröße initialisieren typedef void (* function_2) (int,int); function_2 f_glutInitWindowSize; f_glutInitWindowSize = reinterpret_cast < function_2 > (GetProcAddress (h_DLL_glut32,"glutInitWindowSize")); (* f_glutInitWindowSize) (1024,768); cout << "\nFenstergroesse initialisiert"; // OpenGL - Fensterposition initialisieren typedef void (* function_3) (int,int); function_3 f_glutInitWindowPosition; f_glutInitWindowPosition = reinterpret_cast < function_3 > (GetProcAddress (h_DLL_glut32,"glutInitWindowPosition")); (* f_glutInitWindowPosition) (100,50); cout << "\nFensterposition initialisiert"; // OpenGL - Fenster anzeigen typedef int (* function_4) (char *); function_4 f_glutCreateWindow; f_glutCreateWindow = reinterpret_cast < function_4 > (GetProcAddress (h_DLL_glut32,"glutCreateWindow")); memory [0] = (* f_glutCreateWindow) ("TEST"); // <<--- ABSTURZ HIER !!! cout << "\nFenster erzeugt"; FreeLibrary (h_DLL_opengl32); FreeLibrary (h_DLL_glew32); FreeLibrary (h_DLL_glu32); FreeLibrary (h_DLL_glut32); return 0; };
Jeder wird jetzt denken: So ein Quatsch, da fehlt ja noch alles (MainLoop etc.). Stimmt, das kommt erst später. Außerdem konnte ich ja die glut.h einbinden. Das habe ich auch vorher gemacht und habe den gleichen Fehler bekommen.
Die Frage: Warum stürzt das Programm ab, wenn glutCreateWindow aufgerufen wird?
Ich habe eigentlich opengl32.dll,glew32.dll,glu32.dll sowie glut32.dll aktualisiert, doch trotzdem stürzt das Programm ab.Woran kann das liegen? An meinen Grafiktreibern, oder was
?
Für Ratschläge wäre ich dankbar.
MfG
Seikuassi
-
Wie genau stürzt es denn ab? Wieso lädst du die ganzen Funktionen manuell aus den dlls? Du checkest nicht ab, ob die entsprechenden Funktionen überhaupt gefunden werden konnten. Passen die dlls zu deiner exe? Stimmen die Aufrufkonventionen? ...
-
Hallo dot,
Wieso lädst du die ganzen Funktionen manuell aus den dlls?
Weil ich es zuerst mit der header-Datei versucht habe, was nicht geklappt hat. Deswegen habe ich es direkt mit den DLL's versucht.
Passen die dlls zu deiner exe? Stimmen die Aufrufkonventionen?
Hmm...das ist so ne' Frage, denn laut dieser Website http://www.opengl.org/documentation/specs/glut/spec3/node16.html sind die typedef's richtig initialisiert:
typedef int (* function_4) (char *);
Vllt. könnt Ihr mir einen Gefallen tun, und diese Datei/Code bei euch ausführen (ihr braucht halt die Programmbibliotheken opengl32.dll,glew32.dll,glu32.dll und glut32.dll (streng genommen bis jetzt nur glut32.dll (http://de.dll-files.com/glut32.dll.html))).
Dann kann man nämlich Probleme schonmal ausschließen.MfG
Seikuassi
-
Was sagt dein Debugger, wieso genau stürzt das Programm ab?
Seikuassi schrieb:
Wieso lädst du die ganzen Funktionen manuell aus den dlls?
Weil ich es zuerst mit der header-Datei versucht habe, was nicht geklappt hat. Deswegen habe ich es direkt mit den DLL's versucht.
Hm ja, also wenn das schon nicht funktioniert hat, dann wirst du mit der Variante, die du da gerade verfolgst, sicherlich noch weniger Freude haben, da die Probleme ja nicht einfach so verschwinden, sondern sich lediglich auf noch viel undurchsichtigere Art und Weise äußern werden, wie z.B. gerade eben...
Seikuassi schrieb:
Passen die dlls zu deiner exe? Stimmen die Aufrufkonventionen?
Hmm...das ist so ne' Frage, denn laut dieser Website http://www.opengl.org/documentation/specs/glut/spec3/node16.html sind die typedef's richtig initialisiert:
Dort steht nur die Signatur der Funktion, das sagt noch lange nichts über die Aufrufkonvention in der dll aus, die sehr wahrscheinlich __stdcall sein wird und nicht __cdecl...
-
Hallo nochmal,
hier mein aktueller Code:
int main (int argc,char ** argv) { int memory; HMODULE h_DLL_glut32 = LoadLibrary ("glut32.dll"); // GLUT - initialisieren typedef void (* function_0) (int *,char **); function_0 f_glutInit; f_glutInit = reinterpret_cast < function_0 > (GetProcAddress (h_DLL_glut32,"glutInit")); (* f_glutInit) (& argc,argv); cout << "GLUT - initialisiert"; // GLUT - Fenster erzeugen typedef int (* function_1) (char const *); function_1 f_glutCreateWindow; f_glutCreateWindow = reinterpret_cast < function_1 > (GetProcAddress (h_DLL_glut32,"glutCreateWindow")); memory = (* f_glutCreateWindow) ("TEST"); cout << "\nGLUT - Fenster erzeugt"; // GLUT - Anzeigemodus auswählen typedef void (* function_2) (unsigned int); function_2 f_glutInitDisplayMode; f_glutInitDisplayMode = reinterpret_cast < function_2 > (GetProcAddress (h_DLL_glut32,"glutInitDisplayMode")); (* f_glutInitDisplayMode) (0|2); cout << "\nGLUT - Anzeigemodus initialisiert"; // OpenGL - Fensterposition initialisieren typedef void (* function_3) (int,int); function_3 f_glutInitWindowPosition; f_glutInitWindowPosition = reinterpret_cast < function_3 > (GetProcAddress (h_DLL_glut32,"glutInitWindowPosition")); (* f_glutInitWindowPosition) (35,25); cout << "\nGLUT - Fensterposition initialisiert"; // OpenGL - Fenstergröße initialisieren typedef void (* function_4) (int,int); function_4 f_glutInitWindowSize; f_glutInitWindowSize = reinterpret_cast < function_4 > (GetProcAddress (h_DLL_glut32,"glutInitWindowSize")); (* f_glutInitWindowSize) (1024,768); cout << "\nGLUT - Fenstergroesse initialisiert"; // OpenGL - Fenster anzeigen typedef void (* function_5) (); function_5 f_glutShowWindow; f_glutShowWindow = reinterpret_cast < function_5 > (GetProcAddress (h_DLL_glut32,"glutShowWindow")); (* f_glutShowWindow) (); cout << "\nGLUT - Fenster angezeigt"; // OpenGL - Fenster wieder anzeigen typedef void (* function_6) (); function_6 f_glutPostRedisplay; f_glutPostRedisplay = reinterpret_cast < function_6 > (GetProcAddress (h_DLL_glut32,"glutPostRedisplay")); (* f_glutPostRedisplay) (); cout << "\nGLUT - Fenster wieder angezeigt"; // OpenGL - "MainLoop" aktivieren typedef void (* function_n) (); function_n f_glutMainLoop; f_glutMainLoop = reinterpret_cast < function_n > (GetProcAddress (h_DLL_glut32,"glutMainLoop")); (* f_glutMainLoop) (); cout << "\nGLUT - \"MainLoop\" aktiviert"; FreeLibrary (h_DLL_glut32); system ("pause > NUL"); return 0; };
Es blitzt ein Fenster ganz kurz auf, aber dann entsteht folgender Fehler:
GLUT: Fatal Error in main.exe: redisplay needed for window 1, but no display callback.
Die typedefs waren also eigentlich richtig. Warum verschwindet aber das Fenster?
MfG
Seikuassi
-
Weil ich es zuerst mit der header-Datei versucht habe, was nicht geklappt hat. Deswegen habe ich es direkt mit den DLL's versucht.
Was hat da nicht geklappt?
Die glut.h einzubinden ist eigentlich ziemlich einfach.
Der Code da oben is murks, sorry.
Davon abgesehen ziemlich alt. Benutz glfw oder sonstwas das noch aktiv entwickelt wird. Oder SFML, damit kannst auch einen OpenGL Context erstellen.
-
Die Fehlermeldung sagt eigentlich alles, oder?
-
dot schrieb:
Die Fehlermeldung sagt eigentlich alles, oder?
Anderer Kontext.
-
Hallo nochmal,
hier noch mal mein aktueller ("verbesserter") Code:
void render () { // DLL's laden HMODULE h_DLL_opengl32 = LoadLibrary ("opengl32.dll"); // DLL-Funktionen deklarieren typedef void (* prototype_glClear) (unsigned int); prototype_glClear glClear = reinterpret_cast < prototype_glClear > (GetProcAddress (h_DLL_opengl32,"glClear")); typedef void (* prototype_glBegin) (unsigned int); prototype_glBegin glBegin = reinterpret_cast < prototype_glBegin > (GetProcAddress (h_DLL_opengl32,"glBegin")); typedef void (* prototype_glEnd) (); prototype_glEnd glEnd = reinterpret_cast < prototype_glEnd > (GetProcAddress (h_DLL_opengl32,"glEnd")); typedef void (* prototype_glVertex2f) (float,float); prototype_glVertex2f glVertex2f = reinterpret_cast < prototype_glVertex2f > (GetProcAddress (h_DLL_opengl32,"glVertex2f")); // OpenGL - Puffer löschen (* glClear) (16384); cout << "OpenGL - Puffer geloescht\n"; // OpenGL - Zeichnung initialisieren (* glBegin) (4); cout << "OpenGL - Zeichnung initialisiert\n"; // OpenGL - Zeichnung starten (* glVertex2f) (-0.5,-0.5); (* glVertex2f) (0.5,0.0); cout << "OpenGL - Zeichnung abgeschlossen\n"; // OpenGL - Zeichnung beenden (* glEnd) (); cout << "OpenGL - Zeichnung beendet\n"; // DLL's freigeben FreeLibrary (h_DLL_opengl32); }; int main (int argc,char ** argv) { // DLL's laden HMODULE h_DLL_opengl32 = LoadLibrary ("opengl32.dll"); HMODULE h_DLL_glu32 = LoadLibrary ("glu32.dll"); HMODULE h_DLL_glew32 = LoadLibrary ("glew32.dll"); HMODULE h_DLL_glut32 = LoadLibrary ("glut32.dll"); // DLL-Funktionen deklarieren typedef void (* prototype_glutInit) (int *,char **); prototype_glutInit glutInit = reinterpret_cast < prototype_glutInit > (GetProcAddress (h_DLL_glut32,"glutInit")); typedef void (* prototype_glutInitWindowPosition) (int,int); prototype_glutInitWindowPosition glutInitWindowPosition = reinterpret_cast < prototype_glutInitWindowPosition > (GetProcAddress (h_DLL_glut32,"glutInitWindowPosition")); typedef void (* prototype_glutInitWindowSize) (int,int); prototype_glutInitWindowSize glutInitWindowSize = reinterpret_cast < prototype_glutInitWindowSize > (GetProcAddress (h_DLL_glut32,"glutInitWindowSize")); typedef void (* prototype_glutInitDisplayMode) (unsigned int); prototype_glutInitDisplayMode glutInitDisplayMode = reinterpret_cast < prototype_glutInitDisplayMode > (GetProcAddress (h_DLL_glut32,"glutInitDisplayMode")); typedef int (* prototype_glutCreateWindow) (char *); prototype_glutCreateWindow glutCreateWindow = reinterpret_cast < prototype_glutCreateWindow > (GetProcAddress (h_DLL_glut32,"glutCreateWindow")); typedef void (* prototype_glutShowWindow) (); prototype_glutShowWindow glutShowWindow = reinterpret_cast < prototype_glutShowWindow > (GetProcAddress (h_DLL_glut32,"glutShowWindow")); typedef void (* prototype_glutDisplayFunc) (void (* func) ()); prototype_glutDisplayFunc glutDisplayFunc = reinterpret_cast < prototype_glutDisplayFunc > (GetProcAddress (h_DLL_glut32,"glutDisplayFunc")); typedef void (* prototype_glutMainLoop) (); prototype_glutMainLoop glutMainLoop = reinterpret_cast < prototype_glutMainLoop > (GetProcAddress (h_DLL_glut32,"glutMainLoop")); // GLUT - initialisieren (* glutInit) (& argc,argv); cout << "GLUT - initialisiert\n"; // GLUT - Anzeigemodus initialisieren (* glutInitDisplayMode) (0 | 2 | 16); cout << "GLUT - Anzeigemodus initialisiert\n"; // GLUT - Fenstergröße initialisieren (* glutInitWindowSize) (1024,768); cout << "GLUT - Fenstergroesse initialisiert\n"; // GLUT - Fenster erstellen (* glutCreateWindow) ("TEST"); cout << "GLUT - Fenster erstellt\n"; // GLUT - CALLBACKS registrieren (* glutDisplayFunc) (render); cout << "GLUT - CALLBACKS registriert\n"; // GLUT - Fenster anzeigen (* glutShowWindow) (); cout << "GLUT - Fenster angezeigt\n"; // GLUT - "MainLoop" aktivieren (* glutMainLoop) (); cout << "GLUT - Programm beendet\n\n\n"; // DLL's freigeben FreeLibrary (h_DLL_opengl32); FreeLibrary (h_DLL_glu32); FreeLibrary (h_DLL_glew32); FreeLibrary (h_DLL_glut32); system ("pause > NUL"); return 0; };
Tut mit Leid, dass ich noch die DLL einzeln aufrufe, aber glut.h geht bei mir irgendwie nicht mehr. Ich bekomme folgenden Fehler:
> "g++" main.cpp -o main.exe -I "C:\Program Files (x86)\MinGW" -ansi -w -std=c++11
C:\Users\PHILIP~1\AppData\Local\Temp\cciFShh0.o:main.cpp:(.text+0x109): undefined reference to__glutInitWithExit@12' C:\\Users\\PHILIP~1\\AppData\\Local\\Temp\\cciFShh0.o:main.cpp:(.text+0x129): undefined reference to
__glutCreateWindowWithExit@8'
C:\Users\PHILIP~1\AppData\Local\Temp\cciFShh0.o:main.cpp:(.text+0x149): undefined reference to__glutCreateMenuWithExit@8' c:/program files (x86)/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\\Users\\PHILIP~1\\AppData\\Local\\Temp\\cciFShh0.o: bad reloc address 0x15 in section
.text$_ZN7console2nlEj[__ZN7console2nlEj]'
collect2.exe: error: ld returned 1 exit statusDas Programm oben stürzt zwar nicht ab, aber es erstellt kein Fenster.
Auf der Konsole bekomme ich folgende Ausgabe:GLUT - initialisiert
GLUT - Anzeigemodus initialisiert
GLUT - Fenstergroesse initialisiert
GLUT - Fenster erstellt
GLUT - CALLBACKS registriert
OpenGL - Puffer geloescht
OpenGL - Zeichnung initialisiert
OpenGL - Zeichnung abgeschlossen
OpenGL - Zeichnung beendet
GLUT - Fenster angezeigt
OpenGL - Puffer geloescht
OpenGL - Zeichnung initialisiert
OpenGL - Zeichnung abgeschlossen
OpenGL - Zeichnung beendet
GLUT - Programm beendetErneut frage ich: Warum ist das so
? Beziehungsweise, wie kann ich das Fenster nun erstellen? Und außerdem: Warum wird glutDisplayFunc zweimal aufgerufen?
Danke im Voraus!
MfG
Seikuassi
-
öhm die fehler haben nichts mit dem glut header zu tun.
Das sind linker fehler.
Du musst natürlich auch die glut lib mit linken...
-
Was Firefly sagte... link die glut.lib mit und schau dir nochmal nen Tutorial über Bibliotheken und Linker an.