GLFW3:警告:函数“glGenBuffers”的隐式声明

GLFW3: warning: implicit declaration of function ‘glGenBuffers’

我正在使用 glfw3 使用 opengl 构建一个项目。该程序确实编译并且 运行 没有错误。但是,我收到编译器警告,指出 glGenBuffersglBindBufferglBufferDataglEnableVertexAttribArray 等函数尚未声明。查看这些函数都在 <GL/glext.h> 中声明(其中包含在 gl.h 中)

<GL/gl.h> 中实际声明的函数正在编译时没有警告,例如 glEnableglClearglClearColor

正在编译(产生警告):

gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o

正在链接(无警告):

gcc -o test main.o `pkg-config --static --libs glfw3`

您需要 OpenGL loader, like glLoadGen.

大多数平台仅支持具有 <GL/gl.h> header 的旧版本 OpenGL。在 Windows 上,您获得 OpenGL 1.1,在 Linux/Mesa 上,您获得 OpenGL 1.3。这是由于动态 linking 在这些平台上的工作方式。如果您 link 使用较新版本 OpenGL 的功能,但 运行 您的程序在具有较旧版本 OpenGL 的系统上,则您的程序将完全无法 运行 。这是通过强制人们动态加载 OpenGL 函数来解决的。您可以使用 wglGetProcAddressglXGetProcAddress 或其他函数自行执行此操作,glext.h 旨在帮助您执行此操作,但使用 OpenGL 加载器更容易。

GLEW 可能是最简单的选择,因为大多数包管理器都提供它,但它在核心上下文中无法正常工作。

(请注意,如果您只针对 macOS / iOS,您可以使用弱 linking 代替,并且不需要 OpenGL 加载程序。)

此外,我建议使用 -Werror 或至少 -Werror-implicit-function-declaration 进行编译,这样可以避免意外获得隐式声明。