2011-07-14 66 views
3

我已经开始学习OpenGL并设法使用顶点缓冲对象创建一个旋转立方体。但是,当我编译我的代码时,gcc发出以下警告:如何修复以下gcc警告?

|| sdlogl.c: In function ‘initGL’: 
sdlogl.c|48| warning: implicit declaration of function ‘glGenBuffers’ 
sdlogl.c|50| warning: implicit declaration of function ‘glBindBuffer’ 
sdlogl.c|51| warning: implicit declaration of function ‘glBufferData’ 

我该如何解决这些警告?

这是我的代码:

#include <SDL/SDL.h> 
#include <SDL/SDL_opengl.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glext.h> 

SDL_Surface *surface; 
float rquad=0.0f; 
GLuint vertexBuffer,colorBuffer; 

float vert[]={ 
    1, 1, 1, 1, 1,-1, -1, 1,-1, -1, 1, 1, 
    1,-1, 1, 1,-1,-1, -1,-1,-1, -1,-1, 1, 
    1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1, 
    -1, 1, 1, -1,-1, 1, -1,-1,-1, -1, 1,-1, 
    1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1, 
    1, 1,-1, -1, 1,-1, -1,-1,-1, 1,-1,-1 
}; 
float colors[]={ 
    1,0,0, 1,0,0, 1,0,0, 1,0,0, 
    0,1,0, 0,1,0, 0,1,0, 0,1,0, 
    0,0,1, 0,0,1, 0,0,1, 0,0,1, 
    1,1,0, 1,1,0, 1,1,0, 1,1,0, 
    1,0,1, 1,0,1, 1,0,1, 1,0,1, 
    0,1,1, 0,1,1, 0,1,1, 0,1,1 
}; 

Uint32 timerfunc(Uint32 interval,void* param){ 
    rquad+=0.8f; 
    return interval; 
} 

void initGL(){ 

    glViewport(0,0,640,480); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45,640.0/480.0,0.1,100); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glShadeModel(GL_SMOOTH); 
    glClearColor(0,0,0,0); 
    glClearDepth(1); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 

    glGenBuffers(1,&vertexBuffer); 
    glGenBuffers(1,&colorBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER,72*sizeof(float),vert, 
      GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER,colorBuffer); 
    glBufferData(GL_ARRAY_BUFFER,72*sizeof(float),colors, 
      GL_STATIC_DRAW); 
} 

void drawGLScene(){ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0,0,-6); 
    glRotatef(rquad,1,1,0.5); 

    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer); 
    glVertexPointer(3,GL_FLOAT,0,0); 
    glBindBuffer(GL_ARRAY_BUFFER,colorBuffer); 
    glColorPointer(3,GL_FLOAT,0,0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glDrawArrays(GL_QUADS,0,24); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER,0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 

    SDL_GL_SwapBuffers(); 
} 

int main(int argc, char** argv){ 
    int videoFlags=0; 
    videoFlags|=SDL_OPENGL; 
    videoFlags|=SDL_GL_DOUBLEBUFFER; 
    videoFlags|=SDL_HWPALETTE; 
    videoFlags|=SDL_HWSURFACE; 
    videoFlags|=SDL_HWACCEL; 

    int done=0; 
    SDL_Event event; 
    const SDL_VideoInfo* videoInfo; 

    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); 
    videoInfo=SDL_GetVideoInfo(); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); 

    SDL_WM_SetCaption("Hello OpenGL!",NULL); 
    surface=SDL_SetVideoMode(640,480,32,videoFlags); 

    initGL(); 
    SDL_AddTimer(10,timerfunc,NULL); 
    while(!done){ 
     while(SDL_PollEvent(&event)){ 
      if(event.type==SDL_QUIT){ 
       done=1; 
      } 
     } 
     drawGLScene(); 
    } 
    SDL_Quit(); 
    return 0; 
} 

此外,我使用下面的命令编译我的代码:gcc sdlogl.c -g -Wall -lSDL -lGL -lGLU

回答

4

你得到的那些警告告诉你,提到的函数的原型没有被正确声明,编译器假设默认的C函数签名int()

包括glext.h虽然(由于各种原因)不会给你声明,但给你适当的typedefs自己介绍这些标识符。但随着时间的推移它变得乏味。这就是包装库已经实现的原因。我推荐GLEW或GLEE。使用GLEE,整个事情归结为包括GL/glee.h而不是GL/gl.h

+0

我的印象是GLEE不像GLEW那样积极维护。这是不正确的?此外,使用GLEW归结为包括以及,不是吗? – ssell

+0

@ssell:必须使用glewInit()为每个创建的渲染上下文初始化GLEW。我并没有及时了解GLEW和GLEE的维护状态,因为我的3D引擎使用了我自己的扩展包装器;特别是我使用LoadLibrary/dlopen动态加载opengl32.dll或libGL.so,主要是为了能够检测到正确安装的OpenGL。同样在X11上,这段代码检查libGL.so是否与连接的DISPLAY相匹配,如果不匹配则发出警告;扩展包装只是这个的一小部分。 – datenwolf

+0

啊,我忘记了为每个上下文调用glewInit()。 – ssell

3

这些扩展功能必须使用glXGetProcAddress或使用被加载GLEW(容易)。如果你不这样做,我必须警告你,你的程序会崩溃。