OpenGL GLSL GLUT冲突

OpenGL GLSL GLUT冲突,opengl,glsl,static-libraries,Opengl,Glsl,Static Libraries,好的,我正在尝试制作一个OpenGL应用程序来使用片段着色器。我需要使用glUniform将一些变量放入片段着色器 我见过一些类似的例子: static PFNGLSHADERSOURCEARBPROC glShaderSourceARB; 他们有10个。当我把它们放进去时,它说,以前的glShaderSourceARB声明,或者glShaderSourceARB声明为“extern”,然后声明为“static” 当我不把它放进去时,每次我使用glShaderSourceARB,我都会得到一个

好的,我正在尝试制作一个OpenGL应用程序来使用片段着色器。我需要使用
glUniform
将一些变量放入片段着色器

我见过一些类似的例子:

static PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
他们有10个。当我把它们放进去时,它说,
以前的glShaderSourceARB声明
,或者
glShaderSourceARB声明为“extern”,然后声明为“static”

当我不把它放进去时,每次我使用
glShaderSourceARB
,我都会得到一个
对glShaderSourceARB的未定义引用


这怎么可能?它因为我两次声明而生气,但如果我拿出一份声明,它会说它根本没有声明。有人能解释一下这是如何工作的吗?

好的,您的问题源于缺乏关于C存储和范围限定符的知识

static
在全局范围内表示:此符号仅对其中的编译单元可见,并且仅对该编译单元可见。其他编译单元可能具有相同名称的静态符号,但这些符号也是它们自己的私有符号,它们不会相互干扰

extern
表示它所指的符号是在其他单元的某处定义和公开的(即非
static
)。您通常在标题中使用它。虽然当然可以编写
extern static
,但这通常没有什么意义

现在,您所做的是引入一个新的全局符号,其作用域为
static
scope,而头部已经声明存在一个同名的not
static
符号。编译器会告诉您“对不起,这个名称已经被使用了;但是您的符号与extern声明不匹配,所以请走开。”

然而,只需要一个
extern
声明,但没有符号的实际定义,链接器最终会告诉您:“缺少了一些部分,其中是
xyz
,没有人真正定义它;每个人都引用它(extern),但没有人真正提供它。”

好的,那么您应该将
glShaderSourceARB
定义为非静态吗<斯特朗>不

因为周围有那个符号是不够的。您还必须将其初始化为某些内容。为此,请使用
glXGetProcAddress
wglGetProcAddress
。对于每个符号,必须使用函数名调用它。因为在Windows中,函数地址可能取决于活动的OpenGL上下文,所以每次调用wglMakeCurrent时,都必须将这些符号放入线程本地存储并重新初始化它们


你真正应该做的是给自己找一个库来完成所有这些繁琐的工作,把它放到你的程序中,不再去想它。像GLEW一样,可在获取–仔细阅读文档,遵循每个步骤,事情就会成功(如果您遵循文档)。推荐一句:嵌入GLEW静态地简化了程序分发。

您显然有一个声明函数签名的头,但没有任何链接的库,它实际上包含函数(即
未定义的引用
错误)

在Windows中,该库不包含着色器函数(仅包含OpenGL 1.1之前的函数),必须使用某些第三方库,如GLEW或GLEE。您还可以看到它是如何实现的(它做了GLEW/GLEE所做的事情,只是为了最小化代码大小而进行了优化,比如在4k简介中)


在Linux中,仅使用
-lGL
链接就可以帮助链接OpenGL库abd,从而避免
未定义的引用(如果没有,也可以使用GLEW)。

哇,你在找什么地方
GL\u ARB\u shader\u对象
不是你想搞乱的东西。使用core GLSL,任何介绍性的OpenGL 3.2教程都应该为您设置正确的路径。您所处的位置绝对是错误的。。错误的教程或错误的资源开始与OpenGlWow有人已经做了这一切!我现在在读GLEW的文章,thanks@user3624590:GLEW有它的问题。另一个我非常喜欢的装载机是。实际上,它是一个代码生成器,通过它,您可以选择要在程序中使用的OpenGL配置文件。然后它会创建一个合适的头文件和C源文件,并将其添加到程序中!这将非常方便,尽管设置Lua非常棘手。幸运的是glew现在正在工作,我在Windows上,所以在阅读了glew上的一些内容后,我想我不需要自己找到这些函数