在Linux上为OpenGL 4.2设置开发环境 我使用GLFW和NETBeCK在C++中开发。我可以用即时模式函数进行渲染,没问题。但是,当我尝试使用核心配置文件函数时,会出现如下错误: error: ‘glCreateShader’ was not declared in this scope

在Linux上为OpenGL 4.2设置开发环境 我使用GLFW和NETBeCK在C++中开发。我可以用即时模式函数进行渲染,没问题。但是,当我尝试使用核心配置文件函数时,会出现如下错误: error: ‘glCreateShader’ was not declared in this scope,c++,linux,opengl,C++,Linux,Opengl,对于我尝试的每个核心配置文件函数,我都会得到其中一个错误。我做了一些研究,发现GLFW不提供任何gl头,只包含在我的系统上找到的头(at/usr/include/gl/) 这可能意味着这里找到的gl.h和相关文件只包含老式的OpenGLAPI。我无法理解十六进制代码,但是gl.h文件将gl.u版本定义为0x1F02 如果我在terminal:glxinfo | grep-I opengl中执行此命令,它会确保我的opengl版本字符串为“4.2.0 NVIDIA 304.88”——尽管我认为这反

对于我尝试的每个核心配置文件函数,我都会得到其中一个错误。我做了一些研究,发现GLFW不提供任何gl头,只包含在我的系统上找到的头(at/usr/include/gl/)

这可能意味着这里找到的gl.h和相关文件只包含老式的OpenGLAPI。我无法理解十六进制代码,但是gl.h文件将gl.u版本定义为0x1F02

如果我在terminal:
glxinfo | grep-I opengl
中执行此命令,它会确保我的opengl版本字符串为“4.2.0 NVIDIA 304.88”——尽管我认为这反映在驱动程序中,与gl.h文件无关。在我的应用程序中用C++代码运行这一行产生相同的字符串:<代码> PrimTf(“%s \n”,GLGSTROM(GLYVIEW));<毫无疑问,出于同样的原因

我在哪里可以为Ubuntu 13.04 x64上的OpenGL 3+开发找到合适的OpenGL头文件

我按照大多数教程的建议安装了这些软件包(没有效果):
xorg-dev-libglu1-mesa-dev
glCreateShader(…)
是OpenGL 2.0函数

除了OSX之外,我想不出有哪种平台不需要运行时扩展就可以与OpenGL2.0一起提供。在Microsoft Windows上,您可以保证拥有OpenGL 1.1的完整功能集以及任何需要调用
wglGetProcAddress(…)
来加载其余OpenGL API的函数入口点的功能集。Linux上的情况也是如此,尽管定义“最小”功能集更为困难。在任何情况下,要使用
glCreateShader(…)
必须调用
glXGetProcAddress(…)
才能从驱动程序获取入口点

像GLEW这样的库会让你的生活更轻松,因为它为你的驱动程序支持的每个扩展和核心版本的OpenGL加载了每个函数的入口点,在Ubuntu上甚至应该有一个包含GLEW的软件包。不过,有关实际使用GLEW的更多详细信息,请参见。

glCreateShader(…)
是一个OpenGL 2.0函数

除了OSX之外,我想不出有哪种平台不需要运行时扩展就可以与OpenGL2.0一起提供。在Microsoft Windows上,您可以保证拥有OpenGL 1.1的完整功能集以及任何需要调用
wglGetProcAddress(…)
来加载其余OpenGL API的函数入口点的功能集。Linux上的情况也是如此,尽管定义“最小”功能集更为困难。在任何情况下,要使用
glCreateShader(…)
必须调用
glXGetProcAddress(…)
才能从驱动程序获取入口点


像GLEW这样的库会让你的生活更轻松,因为它为你的驱动程序支持的每个扩展和核心版本的OpenGL加载了每个函数的入口点,在Ubuntu上甚至应该有一个包含GLEW的软件包。尽管如此,有关实际使用GLEW的更多详细信息,请参见。

切勿在
gl.h
中使用
#define
'd值,就好像它们有任何意义一样。这些是用于从OpenGL运行时查询信息的常量ID值,该ID的值在所有实现中都是相同的。在
GL\u版本
的情况下,您可以执行类似于
glGetString(GL\u版本)
的操作,以获取该版本的实现定义值。有时您可以使用“gl2.h”标题。您还可以使用
#定义GL_GLEXT_原型
#包含
。但是,这将静态地将您与使用过的函数链接,因此如果它们不存在,您的程序甚至不会运行。请检查以下Andon关于GLEW的回答,它包含重要信息。切勿在
gl.h
中使用
#define
'd值,就好像它们有任何意义一样。这些是用于从OpenGL运行时查询信息的常量ID值,该ID的值在所有实现中都是相同的。在
GL\u版本
的情况下,您可以执行类似于
glGetString(GL\u版本)
的操作,以获取该版本的实现定义值。有时您可以使用“gl2.h”标题。您还可以使用
#定义GL_GLEXT_原型
#包含
。但是,这将静态地将您与使用过的函数链接,因此如果它们不存在,您的程序甚至不会运行。请检查以下Andon关于GLEW的回答,它包含重要信息。+1表示GLEW。GLee也是一个很好的加载器,但官方只支持OpenGL 3.0。为了让事情更清楚,您实际上不必“必须”使用GetProcAddress。若您直接链接到函数,那个么并没有必要这样做——若目标机器上并没有这些函数,您就无法执行程序。由于GL基于扩展的特性-最好使用GetProcAddress,因为某些程序可能会根据目标上的功能更改其流,但这不是真正的要求。还值得注意的是,如果您创建了GL 4.0+上下文,则GLEW会出现问题(这是因为glGetString(GL_扩展名)不再受4.0支持,必须改用glGetStringi()。也许他们已经解决了这个问题。@keltar:这适用于opengl3.2内核及更高版本。我认为您必须定义预处理器令牌
GLEW_-experiative
来解决这个问题。这有点可笑,当你想到它时-
glGetStringi(…)
必须通过大多数平台上的扩展加载机制加载,但是要“正确”查询它的存在,你必须首先调用它。GLEW真正应该使用的是初始化时的一个参数,该参数指示哪个cont