【问题标题】:How do I fix the following gcc warnings?如何修复以下 gcc 警告?
【发布时间】:2011-07-14 16:28:08
【问题描述】:

我已经开始学习 OpenGL,并设法使用顶点缓冲区对象创建了一个旋转立方体。但是,当我编译我的代码时,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

【问题讨论】:

    标签: opengl gcc gcc-warning vertex-buffer


    【解决方案1】:

    您收到的警告告诉您,上述函数的原型没有正确声明,编译器假定默认的 C 函数签名 int ()

    包含glext.h 虽然不会给你声明(出于各种原因),但会给你适当的类型定义来自己引入这些标识符。不过随着时间的推移会变得乏味。这就是实现包装库的原因。我推荐 GLEW 或 GLEE。使用 GLEE 可以归结为包含 GL/glee.h 而不是 GL/gl.h

    【讨论】:

    • 我的印象是 GLEE 不像 GLEW 那样积极维护。这是不正确的吗?此外,使用 GLEW 归结为也包括 ,不是吗?
    • @ssell:必须使用 glewInit() 为每个创建的渲染上下文初始化 GLEW。我真的不了解 GLEW 和 GLEE 的维护状态,因为对于我的 3D 引擎,我使用我自己的扩展包装器;具体来说,我使用 LoadLibrary/dlopen 动态加载 opengl32.dll 或 libGL.so,主要是为了能够检测 OpenGL 是否正确安装。同样在 X11 上,此代码检查 libGL.so 是否与连接的 DISPLAY 匹配,如果不匹配则发出警告;扩展包装只是其中的一小部分。
    • 啊,我忘了必须为每个上下文调用 glewInit()。
    • Linking @datenwolf 在这里为像我这样的其他人提供了另一个答案,他们找到了这个答案并在扩展机制上寻找更多细节。
    【解决方案2】:

    必须使用glXGetProcAddressGLEW 加载这些扩展函数(更简单)。我必须警告你,如果你不这样做,你的程序将会崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2020-11-28
      • 2017-10-25
      • 2017-07-03
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多