我正在使用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`
答案 0 :(得分:2)
您需要OpenGL loader,例如glLoadGen。
大多数平台仅支持带有<GL/gl.h>
标头的旧版OpenGL。在Windows上你获得OpenGL 1.1,使用Linux / Mesa可以获得OpenGL 1.3。这是由于动态链接在这些平台上的工作方式。如果您链接到较新版本的OpenGL中的某个函数,但在具有较旧版本OpenGL的系统上运行您的程序,则您的程序将无法运行。这可以通过强制人们动态加载OpenGL函数来解决。您可以使用wglGetProcAddress
,glXGetProcAddress
或其他功能自行执行此操作,glext.h
旨在帮助您执行此操作,但使用OpenGL加载程序更容易。
GLEW可能是最简单的选择,因为它可以通过大多数软件包管理器获得,但它在核心环境中无法正常工作。
(请注意,如果您只定位macOS / iOS,则可以使用弱链接,而不需要OpenGL加载器。)
此外,我建议使用-Werror
或至少-Werror-implicit-function-declaration
进行编译,这样可以避免意外获取隐式声明。