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 status

    Das 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 beendet

    Erneut 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.


Anmelden zum Antworten