为什么mingw给`glUseProgram'一个未定义的引用?

该程序是用C语言编写的,使用SDL2和OpenGL。 只要我评论一下

//glUseProgram(0); 

该程序编译并运行并显示glCleared颜色。 包括gl版本检查:

 const char* renderer = (const char*) glGetString(GL_RENDERER); puts(renderer); const char* version = (const char*) glGetString(GL_VERSION); puts(version); const char* glslVersion = (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION); puts(glslVersion); 

哪打印出来:

 ATI Radeon HD 5670 3.2.11927 Core Profile Context 4.20 

和gl错误检查:

 GLenum error = glGetError(); switch(error){ case GL_NO_ERROR: puts("no error"); break; case GL_INVALID_ENUM: puts("invalid enum"); break; case GL_INVALID_VALUE: puts("invalid value"); break; case GL_OUT_OF_MEMORY: puts("out of memory"); break; case GL_INVALID_FRAMEBUFFER_OPERATION: puts("invalid framebuffer operation"); break; default: break; } 

打印:

 no error. 

但是当glUseProgram(0)被取消注释时,我得到以下错误:

 D:\TEMP\ccSTF4cr.o:App.c:(.text+0x320): undefined reference to 'glUseProgram 

我也得到:

 App.c:54.2: warning: implicit declaration of function 'glUseProgram' 

包含的文件是:

 #include "SDL2/SDL.h" #include "SDL2/SDL_opengl.h" 

该程序在Windows XP上使用.bat文件执行。 .bat是:

 del /F /Q bin\app.exe set files=main.c App.c EventHub.c Game.c MainShader.c set libs=-LD:\environments\minGW\mingw32\lib -lmingw32 -lopengl32 -lSDL2main -mwindows -lSDL2 set objs=bin\main.obj gcc -Wall -o bin/app %files% %libs% bin\app.exe 

如果您不知道.bats,则命令中的%file%和%libs%将被replace为variables中的string。

这个问题似乎是上下文不支持后来的glUseProgram函数,除了上下文是支持该函数的3.2版本。 在这种情况下,这个问题似乎是在SDL_opengl.h的附近,包括正在拾取一个错误-lopengl32。 但坦率地说,我不太明白这个为什么我问这个问题的连接的东西。

Microsoft Windows OpenGL API最多只具有版本1.X的功能。 (因为他们更喜欢使用Direct3D。)

为了使用现代的OpenGL – 呃,比1995年更新的东西 – 在MS Windows上,你需要一个扩展管理器,比如GLEW或者GLEE。 有关详细信息,请参阅任何版本的OpenGL SuperBible。