2012-05-27 57 views
0

下我下面一些教程,并用下面的代码上来:分割故障Linux的

// rendering.cpp 

#include "rendering.h" 
#include <GL/gl.h> 
#include <GL/freeglut.h> 

void DrawGLScene() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
} 

int InitGL(int argc, char** argv) 
{ 
    /*glShadeModel(GL_SMOOTH); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);*/ 

    glutInit(&argc, argv); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(100, 100); 
    glutDisplayFunc(DrawGLScene); 
    glutCreateWindow("Swimming Simulation"); 
    glutMainLoop(); // Enter GLUT's main loop 

    return true; 
} 

我的主要功能是非常简单,只调用该函数:

#include "rendering.h" 

int main(int argc, char** argv) 
{ 
    InitGL(argc, argv); 
    return 0; 
} 

我用这个命令编译:

g++ -Wall -g swim.cpp rendering.cpp -lglut -lGLU -o swim 

运行swim创建一个窗口为预计。

(gdb) r 
Starting program: <dir> 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib64/libthread_db.so.1". 

Program received signal SIGSEGV, Segmentation fault. 
0x000000335ca52ca7 in glShadeModel() from /usr/lib64/libGL.so.1 
Missing separate debuginfos, use: debuginfo-install freeglut-2.6.0-6.fc15.x86_64 glibc-2.14.90-24.fc16.6.x86_64 libX11-1.4.3-1.fc16.x86_64 libXau-1.0.6-2.fc15.x86_64 libXdamage-1.1.3-2.fc15.x86_64 libXext-1.3.0-1.fc16.x86_64 libXfixes-5.0-1.fc16.x86_64 libXi-1.4.5-1.fc16.x86_64 libXxf86vm-1.1.1-2.fc15.x86_64 libdrm-2.4.33-1.fc16.x86_64 libgcc-4.6.3-2.fc16.x86_64 libstdc++-4.6.3-2.fc16.x86_64 libxcb-1.7-3.fc16.x86_64 mesa-libGL-7.11.2-3.fc16.x86_64 mesa-libGLU-7.11.2-3.fc16.x86_64 
(gdb) backtrace 
#0 0x000000335ca52ca7 in glShadeModel() from /usr/lib64/libGL.so.1 
#1 0x0000000000401d67 in InitGL (argc=1, argv=0x7fffffffe198) 
    at rendering.cpp:25 
#2 0x0000000000401c8c in main (argc=1, argv=0x7fffffffe198) at swim.cpp:37 

我应该在这里做让我的程序没有崩溃运行:但是,如果我在InitGL取消注释行,然后我运行程序时得到一个分段错误?

回答

1

只有存在OpenGL上下文时才能调用OpenGL函数 - 如果使用GLUT,则会在glutCreateWindow函数调用后调用。

但他们不应该崩溃,这个应用程序...

5

你掉进GLUT的一个棘手的陷阱。 GLUT是一种像OpenGL这样的状态机(它不是OpenGL的一部分)。创建或选择窗口后,必须设置回调函数。在你的情况下,在glutCreateWindow的呼叫后移动glutDisplayFunc(以及其他任何回调设置器)的呼叫。