GLFW3:警告:函数“glGenBuffers”的隐式声明
GLFW3: warning: implicit declaration of function ‘glGenBuffers’
我正在使用 glfw3 使用 opengl 构建一个项目。该程序确实编译并且 运行 没有错误。但是,我收到编译器警告,指出 glGenBuffers
、glBindBuffer
、glBufferData
和 glEnableVertexAttribArray
等函数尚未声明。查看这些函数都在 <GL/glext.h>
中声明(其中包含在 gl.h 中)
在 <GL/gl.h>
中实际声明的函数正在编译时没有警告,例如 glEnable
、glClear
和 glClearColor
。
正在编译(产生警告):
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 函数来解决的。您可以使用 wglGetProcAddress
、glXGetProcAddress
或其他函数自行执行此操作,glext.h
旨在帮助您执行此操作,但使用 OpenGL 加载器更容易。
GLEW 可能是最简单的选择,因为大多数包管理器都提供它,但它在核心上下文中无法正常工作。
(请注意,如果您只针对 macOS / iOS,您可以使用弱 linking 代替,并且不需要 OpenGL 加载程序。)
此外,我建议使用 -Werror
或至少 -Werror-implicit-function-declaration
进行编译,这样可以避免意外获得隐式声明。
我正在使用 glfw3 使用 opengl 构建一个项目。该程序确实编译并且 运行 没有错误。但是,我收到编译器警告,指出 glGenBuffers
、glBindBuffer
、glBufferData
和 glEnableVertexAttribArray
等函数尚未声明。查看这些函数都在 <GL/glext.h>
中声明(其中包含在 gl.h 中)
在 <GL/gl.h>
中实际声明的函数正在编译时没有警告,例如 glEnable
、glClear
和 glClearColor
。
正在编译(产生警告):
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 函数来解决的。您可以使用 wglGetProcAddress
、glXGetProcAddress
或其他函数自行执行此操作,glext.h
旨在帮助您执行此操作,但使用 OpenGL 加载器更容易。
GLEW 可能是最简单的选择,因为大多数包管理器都提供它,但它在核心上下文中无法正常工作。
(请注意,如果您只针对 macOS / iOS,您可以使用弱 linking 代替,并且不需要 OpenGL 加载程序。)
此外,我建议使用 -Werror
或至少 -Werror-implicit-function-declaration
进行编译,这样可以避免意外获得隐式声明。