OpenGl stürzt ab
-
Guten Nachmittag.
Ich versuche jetzt seit gestern verzweifelt OpenGl mit glut32 + freeglut zum Laufen zu bringen, aber es will nicht...
Als IDE benutze ich Code::Blocks und der Compiler ist MinGW (GCC).
Folgende Librarys sind gelinkt:
glut32.a
libfreeglut.a
libfreeglut_static.aAls zusätzliche Linker-optionen habe ich -lwsock32 angegeben, aber das belangt jetzt wohl kaum^^
Mit im Projektordner liegt die freeglut.dll und die glut32.dll (wenn sie im system32 liegt, erkennt der linker sie nicht).
Wenn ich nun das unten genannte Beispielscript starte erscheint ein weißes Fenster und gleich danach die Meldung:
"OpenGl.exe funktioniert nicht mehr". Ich kann nich so gut mit nem Debugger umgehen, aber er meinte als Fehlermeldung "Segmentation fault".
Mein OS ist Win7 Ultimate. Der Grafik-Treiber sollte eig. recht neu sein.
Allerdings funktioniert auch kein anderes Beispiel.../* * GLUT Shapes Demo * * Written by Nigel Stewart November 2003 * * This program is test harness for the sphere, cone * and torus shapes in GLUT. * * Spinning wireframe and smooth shaded shapes are * displayed until the ESC or q key is pressed. The * number of geometry stacks and slices can be adjusted * using the + and - keys. */ #ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #endif #include <stdlib.h> static int slices = 16; static int stacks = 16; /* GLUT callback Handlers */ static void resize(int width, int height) { const float ar = (float) width / (float) height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity() ; } static void display(void) { const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; const double a = t*90.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1,0,0); glPushMatrix(); glTranslated(-2.4,1.2,-6); glRotated(60,1,0,0); glRotated(a,0,0,1); glutSolidSphere(1,slices,stacks); glPopMatrix(); glPushMatrix(); glTranslated(0,1.2,-6); glRotated(60,1,0,0); glRotated(a,0,0,1); glutSolidCone(1,1,slices,stacks); glPopMatrix(); glPushMatrix(); glTranslated(2.4,1.2,-6); glRotated(60,1,0,0); glRotated(a,0,0,1); glutSolidTorus(0.2,0.8,slices,stacks); glPopMatrix(); glPushMatrix(); glTranslated(-2.4,-1.2,-6); glRotated(60,1,0,0); glRotated(a,0,0,1); glutWireSphere(1,slices,stacks); glPopMatrix(); glPushMatrix(); glTranslated(0,-1.2,-6); glRotated(60,1,0,0); glRotated(a,0,0,1); glutWireCone(1,1,slices,stacks); glPopMatrix(); glPushMatrix(); glTranslated(2.4,-1.2,-6); glRotated(60,1,0,0); glRotated(a,0,0,1); glutWireTorus(0.2,0.8,slices,stacks); glPopMatrix(); glutSwapBuffers(); } static void key(unsigned char key, int x, int y) { switch (key) { case 27 : case 'q': exit(0); break; case '+': slices++; stacks++; break; case '-': if (slices>3 && stacks>3) { slices--; stacks--; } break; } glutPostRedisplay(); } static void idle(void) { glutPostRedisplay(); } const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f }; const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; /* Program entry point */ int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(640,480); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("GLUT Shapes"); glutReshapeFunc(resize); glutDisplayFunc(display); glutKeyboardFunc(key); glutIdleFunc(idle); glClearColor(1,1,1,1); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glutMainLoop(); return EXIT_SUCCESS; }
-
So sehe ich gerade keinen Fehler im Code, dazumal das ein Standardbeispiel zu sein scheint. Versuch doch mal, den Code für die zu rendernden Objekte nach und nach herauszukommentieren, um den Fehler einzugrenzen.
Die Libs mit .a-Endung sind auch für Windows compiliert beziehungsweise wo hast du dir her? Ich kenne mich mit dem Linken unter MinGW nicht so gut aus, daher die wahrscheinlich etwas dumme Nachfrage meinerseits. Ich kenne nur die klassischen .lib-Libs. Die .a-libs kenne ich nur von Linux / Unix.
Vielleicht hast du irgendwelche Libs durcheinandergebracht, das Tool depends.exe kann dir dabei helfen, ewaitige fehler zu finden ( das überprüft, ob alle Dlls korrkt geladen wurden ). Einfach mal danach googlen.Gruß Kimmi
-
Die Funktion glutCreateWindow(...) gibt 0 zurück falls das Fenster nicht geöffnet werden konnte.
Damit könntest Du das Problem zumindest einschränken.
-
Hey kimmi, das mit den Libs kam mir auch sehr merkwürdig vor... Ich habe schon ein paar Stunden gebraucht um die Dll's und die Libs zusammenzusuchen, weshalb ich jetzt selbst nicht mehr weiss, welche Lib ich von welcher Seite habe
Könnte mir bitte jemand den Link für die offiziellen Dll's und Lib's für OpenGL geben?
Anscheinend habe ich da die falschen über google.de gefunden^^ Leider ergab meine Suche nach der Windows-Library keine vernünftigen Ergebnisse...
Wahrscheinlich hast du Recht und es handelt sich einfach nur um eine Inkompillität mit Windows...
Ausserdem stelle ich mich wohl gerade extrem dumm beim Suchen an -.-
mfg @night@
-
Hier gibt es die Sourcecodes für freeglut:
http://sourceforge.net/projects/freeglut/files/freeglut/freeglut-2.6.0.tar.gz/downloadFalls du es fertig gebaut brauchst für MinGW:
http://www.transmissionzero.co.uk/software/freeglut-devel/Da ich noch nicht auf Windows7 umgestiegen bin interessiert mich
trotzdem ob glutCreateWindow() NULL zurück gibt bei Dir, oder ob es
einfach so abschmiert.Laut Webside soll Freeglut nämlich auch auf Windows7 laufen.
Gruß
Trooper
-
Danke trooper für die Links^^ Ich hatte die zwar schon zuvor runtergeladen, aber hab sie im allgemeinen Wirwarr irgendwie falsch verschoben und falsch gelinkt-.-
Jetzt habe ich folgende Lib's gelinkt:
glut32.lib
freeglut.libAusserdem liegt im Order die freeglut.dll und die glut32.dll. Allerdings kriege ich jetzt folgenden Linker-Fehler angezeigt:
C:\Users\Username\Desktop\C++\Librarys\freeglut\include\GL\freeglut_std.h|612|undefined reference to `__imp____glutCreateWindowWithExit@8'|
Das ganze wiederholt sich nen paar mal mit verschiedenen Endziffern...
Wenn ich die glut.lib noch hinzufüge, stürzt das Programm wie gewohnt ab...Zu deiner Frage: Ich komme gar nicht mehr dazu den Rückgabewert zu kontrollieren, da das Programm innerhalb der FUnktion schon abstürzt. Heisst: Das Programm erreicht gar nicht mehr den Punkt an dem kontrolliert wird^^
Hier noch mal die Informationen meines Grafiktreibers:
Treiber-Paketversion 8.663-091006a-090554C Anbieter ATI Technologies Inc. 2D-Treiberversion 8.01.01.961 2D-Treiberpfad /REGISTRY/MACHINE/SYSTEM/ControlSet001/Control/CLASS/{4D36E968-E325-11CE-BFC1-08002BE10318}/0000 Direct3D-Version 8.14.10.0700 OpenGL-Version 6.14.10.9030 Catalyst™ Control Center-Version 2009.1006.2226.38455
mfg @night@
-
Versuch mal
#define GLUT_DISABLE_ATEXIT_HACK
vor dem einbinden von glut.h zu setzten.Leider kann ich es nicht testen ohne Windows7.
-
Hey trooper, du bist genial
Jetzt funktioniert es sehr gutAber hat das disablen dieser Funktion (oder was es auch immer ist) nicht irgendwelche Nachteile???
-
Schön das es geklappt hat.
Nachteile sollte das keine haben, soweit ich weiß.
Gruß
Trooper