2011-07-14 67 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(容易)。如果你不這樣做,我必須警告你,你的程序會崩潰。