【问题标题】:Having trouble getting GLEW to work无法让 GLEW 工作
【发布时间】:2011-08-07 01:57:54
【问题描述】:

注意:glGetString(GL_VERSION) 返回:2.1.0 - Build 8.15.10.2361

我已将 GLEW 安装到 System32 以及 VCDir/lib 和 VCDir/include 目录。所以链接器在找到 GLEW 的必要位时应该没有任何问题。我遇到的麻烦是以下代码:

void foo()
{
    Uint32 vboId;

    glGenBuffers(1, &vboId);
}

给我以下错误:

unresolved external symbol __imp____glewGenBuffers

这个错误是我决定安装 GLEW 的全部原因。见:unresolved external symbol _glGenBuffers error

除了这个错误之外,还有一些令人担忧的警告:

Warning 1   warning C4028: formal parameter 3 different from declaration    c:\sdl-1.2.14\include\sdl_opengl.h  4855    1   Prototek
Warning 2   warning C4028: formal parameter 3 different from declaration    c:\sdl-1.2.14\include\sdl_opengl.h  4857    1   Prototek
Warning 3   warning C4028: formal parameter 2 different from declaration    c:\sdl-1.2.14\include\sdl_opengl.h  4859    1   Prototek
Warning 4   warning C4028: formal parameter 2 different from declaration    c:\sdl-1.2.14\include\sdl_opengl.h  4861    1   Prototek
Warning 5   warning C4028: formal parameter 3 different from declaration    c:\sdl-1.2.14\include\sdl_opengl.h  4868    1   Prototek
Warning 6   warning C4028: formal parameter 3 different from declaration    c:\sdl-1.2.14\include\sdl_opengl.h  4869    1   Prototek

另外,像我为 GLEW 所做的那样,将 SDL 简单地安装到我的 VC inc 和 lib 和 System32 目录是否是个好主意?

我的文件顶部的#include 如下所示:

#include <stdio.h>
#include <glew.h>
#include "sdl.h"
#include "sdl_opengl.h"
#include <gl/GLU.h>
#include <gl/GL.h>

但如果需要,这里是整个代码体:

#include <stdio.h>
#include <glew.h>
#include "sdl.h"
#include "sdl_opengl.h"
#include <gl/GLU.h>
#include <gl/GL.h>

Uint32 loadTexture(char* fileName)
{
    Uint32 id;
    SDL_Surface *img = NULL;

    //load into memory using SDL
    img = SDL_LoadBMP(fileName);
    //generate an id for this texture
    glGenTextures(1, &id);
    //use this texture
    glBindTexture(GL_TEXTURE_2D, id);
    //load the texture into video memory via OpenGL
    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_RGB,
        img->w,
        img->h,
        0,
        GL_BGR,
        GL_UNSIGNED_BYTE,
        img->pixels
        );

    //set mip map settings
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    SDL_FreeSurface(img);

    return id;
}

Uint32 tex;

void init()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

    tex = loadTexture("fireball.bmp");
}
void foo()
{
    Uint32 vboId;

    glGenBuffers(1, &vboId);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D, tex);

    glBegin(GL_QUADS);
    glTexCoord2f(0.5, 0.5);
    glVertex3f(0.25, 0.25, 0.0);


    glTexCoord2f(1.0, 0.5);
    glVertex3f(0.5, 0.25, 0.0);


    glTexCoord2f(1.0, 1.0);
    glVertex3f(0.5, 0.5, 0.0);


    glTexCoord2f(0.5, 1.0);
    glVertex3f(0.25, 0.5, 0.0);
    glEnd();
}

int main()
{
    Uint32 isRunning = 1;
    SDL_Surface *screen = NULL;
    SDL_Event event;
    Uint32 start;
    Uint32 FPS = 30;

    SDL_Init(SDL_INIT_EVERYTHING);

    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);

    init();

    while(isRunning)
    {
        start = SDL_GetTicks();

        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
                case SDL_QUIT: isRunning = 0; break;
            }
        }

        display();

        SDL_GL_SwapBuffers();

        if(1000 / FPS > SDL_GetTicks() - start)
        {
            SDL_Delay(1000 / FPS - (SDL_GetTicks() - start));
        }
    }

    SDL_Quit();

    return(0);
}

【问题讨论】:

    标签: c opengl sdl unresolved-external glew


    【解决方案1】:

    我注意到您没有包含对 glewInit() 的调用,如果您打算使用 glew,请确保在使用它提供的任何 openGL 函数指针之前调用它。

    【讨论】:

      【解决方案2】:

      您是否真的链接到 GLEW 库?仅仅告诉 VS 目录在哪里是不够的;你必须告诉它要链接到哪个库。

      测试您是否链接到库的一种快速方法是删除它并重新编译。如果 VC 没有抱怨找不到特定的库,那么你没有链接到它。

      另外,像我为 GLEW 所做的那样,将 SDL 简单地安装到我的 VC inc 和 lib 和 System32 目录是否是个好主意?

      在那里安装 GLEW 不是一个好主意,更不用说其他任何东西了。 Visual Studio 不像 Linux 安装。没有库和标头的全局存储库。您可以将 VS 项目指向特定的库和头文件(如果需要,您甚至可以全局设置它们)。保留 VS 目录。

      【讨论】:

      • 我会将 GLEW 移动到 C:\ 并以正常方式将我的 VS 指向它。
      【解决方案3】:

      glGenBuffers 第二个参数是指向 GLuint (GLuint ) 的指针,而不是指向 GLuint 的指针的指针 (GLuint *,这是您传递的内容)。而是这样做:

      Uint32 vboId;
      
      glGenBuffers(1, &vboId);
      

      【讨论】:

      • 我编辑了我的帖子。抱歉,那是无意的。问题以一种或另一种方式持续存在。不过你是对的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2014-12-26
      • 2017-12-22
      相关资源
      最近更新 更多