2013-06-21 50 views
2

继承人我的代码。一个opengl4.0教程:为什么我会得到4个“gluErrorString @ 4”未定义引用的实例“

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#define GLEW_STATIC 
#include "GL/glew.h" 
#include <GL/freeglut.h> 
#define WINDOW_TITLE_PREFIX "Chapter 2" 

int CurrentWidth = 800, 
    CurrentHeight = 600, 
    WindowHandle = 0; 

unsigned FrameCount = 0; 
GLuint 
    VertexShaderId, 
    FragmentShaderId, 
    ProgramId, 
    VaoId, 
    VboId, 
    ColorBufferId; 

const GLchar* VertexShader = 
{ 
    "#version 400\n"\ 
    "layout(location=0) in vec4 in_Position;\n"\ 
    "layout(location=1) in vec4 in_Color;\n"\ 
    "out vec4 ex_Color;\n"\ 

    "void main(void)\n"\ 
    "{\n"\ 
    " gl_Position = in_Position;\n"\ 
    " ex_Color = in_Color;\n"\ 
    "}\n" 
}; 

const GLchar* FragmentShader = 
{ 
    "#version 400\n"\ 

    "in vec4 ex_Color;\n"\ 
    "out vec4 out_Color;\n"\ 

    "void main(void)\n"\ 
    "{\n"\ 
    " out_Color = ex_Color;\n"\ 
    "}\n" 
}; 

void Initialize(int, char*[]); 
void InitWindow(int argc, char* argv[]); 
void ResizeFunction(int, int); 
void RenderFunction(void); 
void TimerFunction(int); 
void IdleFunction(void); 
void Cleanup(void); 
void CreateVBO(void); 
void DestroyVBO(void); 
void CreateShaders(void); 
void DestroyShaders(void); 

int main(int argc, char* argv[]) 
{ 
    Initialize(argc, argv); 

    glutMainLoop(); 

    exit(EXIT_SUCCESS); 
} 

void Initialize(int argc, char* argv[]) 
{ 
    GLenum GlewInitResult; 
    InitWindow(argc, argv); 



    GlewInitResult = glewInit(); 
    if (GLEW_OK != GlewInitResult) { 
     fprintf(
      stderr, 
      "ERROR: %s\n", 
      glewGetErrorString(GlewInitResult) 
     ); 
     exit(EXIT_FAILURE); 
    } 

    fprintf(
     stdout, 
     "INFO: OpenGL Version: %s\n", 
     glGetString(GL_VERSION) 
    ); 

    CreateShaders(); 
    CreateVBO(); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
} 

void InitWindow(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitContextVersion(4, 0); 
    glutInitContextFlags(GLUT_FORWARD_COMPATIBLE); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 

    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); 

    glutInitWindowSize(CurrentWidth, CurrentHeight); 

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 

    WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX); 

    if(WindowHandle < 1) { 
     fprintf(
      stderr, 
      "ERROR: Could not create a new rendering window.\n" 
     ); 
     exit(EXIT_FAILURE); 
    } 

    glutReshapeFunc(ResizeFunction); 
    glutDisplayFunc(RenderFunction); 
    glutIdleFunc(IdleFunction); 
    glutTimerFunc(0, TimerFunction, 0); 
    glutCloseFunc(Cleanup); 

} 

void ResizeFunction(int Width, int Height) 
{ 
    CurrentWidth = Width; 
    CurrentHeight = Height; 
    glViewport(0, 0, CurrentWidth, CurrentHeight); 
} 

void RenderFunction(void) 
{ 
    ++FrameCount; 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glutSwapBuffers(); 
    glutPostRedisplay(); 
} 

void IdleFunction(void) 
{ 
    glutPostRedisplay(); 
} 

void TimerFunction(int Value) 
{ 
    if (0 != Value) { 
     char* TempString = (char*) 
      malloc(512 + strlen(WINDOW_TITLE_PREFIX)); 

     sprintf(
      TempString, 
      "%s: %d Frames Per Second @ %d x %d", 
      WINDOW_TITLE_PREFIX, 
      FrameCount * 10, 
      CurrentWidth, 
      CurrentHeight 
     ); 

     glutSetWindowTitle(TempString); 
     free(TempString); 
    } 

    FrameCount = 0; 
    glutTimerFunc(100, TimerFunction, 1); 
} 

void Cleanup(void) 
{ 
    DestroyShaders(); 
    DestroyVBO(); 
} 

void CreateVBO(void) 
{ 
    GLfloat Vertices[] = { 
     -0.8f, -0.8f, 0.0f, 1.0f, 
     0.0f, 0.8f, 0.0f, 1.0f, 
     0.8f, -0.8f, 0.0f, 1.0f 
    }; 

    GLfloat Colors[] = { 
     1.0f, 0.0f, 0.0f, 1.0f, 
     0.0f, 1.0f, 0.0f, 1.0f, 
     0.0f, 0.0f, 1.0f, 1.0f 
    }; 

    GLenum ErrorCheckValue = glGetError(); 

    glGenVertexArrays(1, &VaoId); 
    glBindVertexArray(VaoId); 

    glGenBuffers(1, &VboId); 
    glBindBuffer(GL_ARRAY_BUFFER, VboId); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(0); 

    glGenBuffers(1, &ColorBufferId); 
    glBindBuffer(GL_ARRAY_BUFFER, ColorBufferId); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(1); 

    ErrorCheckValue = glGetError(); 

    if (ErrorCheckValue != GL_NO_ERROR) 
    { 
     fprintf(
      stderr, 
      "ERROR: Could not create a VBO: %s \n", 
      gluErrorString(ErrorCheckValue) 
     ); 

     exit(-1); 
    } 
} 

void DestroyVBO(void) 
{ 
    GLenum ErrorCheckValue = glGetError(); 

    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glDeleteBuffers(1, &ColorBufferId); 
    glDeleteBuffers(1, &VboId); 

    glBindVertexArray(0); 
    glDeleteVertexArrays(1, &VaoId); 

    ErrorCheckValue = glGetError(); 
    if (ErrorCheckValue != GL_NO_ERROR) 
    { 
     fprintf(
      stderr, 
      "ERROR: Could not destroy the VBO: %s \n", 
      gluErrorString(ErrorCheckValue) 
     ); 

     exit(-1); 
    } 
} 

void CreateShaders(void) 
{ 
    GLenum ErrorCheckValue = glGetError(); 

    VertexShaderId = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(VertexShaderId, 1, &VertexShader, NULL); 
    glCompileShader(VertexShaderId); 

    FragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(FragmentShaderId, 1, &FragmentShader, NULL); 
    glCompileShader(FragmentShaderId); 

    ProgramId = glCreateProgram(); 
     glAttachShader(ProgramId, VertexShaderId); 
     glAttachShader(ProgramId, FragmentShaderId); 
    glLinkProgram(ProgramId); 
    glUseProgram(ProgramId); 

    ErrorCheckValue = glGetError(); 
    if (ErrorCheckValue != GL_NO_ERROR) 
    { 
     fprintf(
      stderr, 
      "ERROR: Could not create the shaders: %s \n", 
      gluErrorString(ErrorCheckValue) 
     ); 

     exit(-1); 
    } 
} 

void DestroyShaders(void) 
{ 
    GLenum ErrorCheckValue = glGetError(); 

    glUseProgram(0); 

    glDetachShader(ProgramId, VertexShaderId); 
    glDetachShader(ProgramId, FragmentShaderId); 

    glDeleteShader(FragmentShaderId); 
    glDeleteShader(VertexShaderId); 

    glDeleteProgram(ProgramId); 

    ErrorCheckValue = glGetError(); 
    if (ErrorCheckValue != GL_NO_ERROR) 
    { 
     fprintf(
      stderr, 
      "ERROR: Could not destroy the shaders: %s \n", 
      gluErrorString(ErrorCheckValue) 
     ); 

     exit(-1); 
    } 
} 

其完整的代码是什么我在使用MinGW的是运行在Windows 7 64位系统的代码块。它的第2章openglbook.com。它应该实现im在项目链接设置(不是编译器)中按顺序执行glew32s,freeglut和opengl。

我听说动态运行比较好,但是如果动态变化,我会得到一堆未定义的glew命令错误。所以我不得不在连接器中设置“#define glew_static”和glew32s。

这可能是什么原因造成的?

-------------- Build: Debug in 40 (compiler: GNU GCC Compiler)--------------- 

mingw32-g++.exe -Wall -g -ID:\backup\funstuff\programming\freeglut\include -c D:\backup\funstuff\programming\40\main.cpp -o obj\Debug\main.o 
mingw32-g++.exe -o bin\Debug\40.exe obj\Debug\main.o -lglew32s -lfreeglut -lopengl32 
Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unrecognized 
obj\Debug\main.o: In function `Z9CreateVBOv': 
D:/backup/funstuff/programming/40/main.cpp:219: undefined reference to `[email protected]' 
obj\Debug\main.o: In function `Z10DestroyVBOv': 
D:/backup/funstuff/programming/40/main.cpp:247: undefined reference to `[email protected]' 
obj\Debug\main.o: In function `Z13CreateShadersv': 
D:/backup/funstuff/programming/40/main.cpp:278: undefined reference to `[email protected]' 
obj\Debug\main.o: In function `Z14DestroyShadersv': 
D:/backup/funstuff/programming/40/main.cpp:305: undefined reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 
Process terminated with status 1 (0 minutes, 1 seconds) 
4 errors, 1 warnings (0 minutes, 1 seconds) 

*编辑*

我已经下载wsys和安装的MinGW到一个单独的目录中并重新编译GLEW-1.9.0和替换DLL和库。仍然一样的错误,但没有~~~~~~~~~~~>警告:.drectve/DEFAULTLIB:“LIBCMT”/ DEFAULTLIB:“OLDNAMES”'无法识别< ~~~~~~~警告。

这btw,只存在,因为从glews网站编译的DLL和库在VisualC上完成。

+0

链接glew32s.lib时,它必须位于代码块中列表的顶部。 –

+0

可能出现重复http://stackoverflow.com/questions/16923876/getting-glew-to-compile-in-codeblocks/16930933#16930933 –

+0

glew32s和glew32一直在我的列表的顶部。我知道你指的是这个问题。这与此无关。谢谢你! – CodeSeven

回答

2

gluErrorString在glu.h中定义,位于glu32.dll中。 glu32.dll没有添加到链接器设置,因此我的代码没有完全识别这些行。

相关问题