3

I've started learning OpenGL and managed to create a spinning cube using vertex buffer objects. However, when I compile my code, gcc issues the following warnings:

|| 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’

What should I do to fix these warnings?

This is my code:

#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;
}

In addition, I compile my code using the following command: gcc sdlogl.c -g -Wall -lSDL -lGL -lGLU

Alexandros
  • 3,044
  • 1
  • 23
  • 37

2 Answers2

4

Those warnings you get tell you, that the mentioned functions' prototypes have not been properly declared and the compiler is presuming the default C function signature int ().

Including glext.h will not give you the declarations though (for various reasons), but gives you proper typedefs to introduce those identifiers yourself. It gets tedious over time though. That's why wrapper libraries have been implemented. I recomment GLEW or GLEE. Using GLEE the whole thing boils down to including GL/glee.h instead of GL/gl.h.

datenwolf
  • 159,371
  • 13
  • 185
  • 298
  • I was under the impression that GLEE was not as actively maintained as GLEW. Is this incorrect? Also, using GLEW boils down to including as well, does it not? – ssell Jul 14 '11 at 17:24
  • @ssell: GLEW must be initialized using glewInit() for each created rendering context. I'm really not up-to-date with the maintenance status of both GLEW and GLEE, since for my 3D engine I use my very own extension wrapper; specifically I load opengl32.dll or libGL.so dynamically with LoadLibrary/dlopen, mainly to be able to detect OpenGL being installed properly. Also on X11 this code checks if the libGL.so matches the connected DISPLAY and issues a warning if they don't match; the extension wrapper is just a small part of this. – datenwolf Jul 14 '11 at 19:28
  • Ah, I forgot about having to call glewInit() for each context. – ssell Jul 14 '11 at 19:39
  • [Linking](http://stackoverflow.com/questions/12122631/difference-between-opengl-files-glew-h-and-gl-h-glu-h) @datenwolf 's another answer here for anybody else like me, who found this answer and looking for more elaboration on extension mechanisms. – Samik Mar 20 '16 at 09:47
3

Those extension functions must be loaded using glXGetProcAddress or using GLEW (easier). I must warn you that your program will crash if you don't do so.

tibur
  • 11,531
  • 2
  • 37
  • 39