OpenGL演示过山车链接错误

时间:2013-10-30 08:43:08

标签: opengl dynamic-linking

我已经链接到glut32.lib并将glut32.dll放在调试文件夹中

然而,仍然存在错误,我不知道它们链接到哪些库

solved external symbol __imp__glMaterialfv@12 referenced in function "void __cdecl copper_texture(void)" (?copper_texture@@YAXXZ)
1>rc.obj : error LNK2019: unresolved external symbol __imp__glVertex3f@12 referenced in function "void __cdecl do_display(void)" (?do_display@@YAXXZ)
1>rc.obj : error LNK2019: unresolved external symbol __imp__glNormal3f@12 referenced in function "void __cdecl do_display(void)" (?do_display@@YAXXZ)
1>rc.obj : error LNK2019: unresolved external symbol __imp__glEnd@0 referenced in function "void __cdecl do_display(void)" (?do_display@@YAXXZ)
1>rc.obj : error LNK2019: unresolved external symbol __imp__glVertex3fv@4 referenced in function "void __cdecl do_display(void)" (?do_display@@YAXXZ)
1>rc.obj : error LNK2019: unresolved external symbol __imp__glNormal3fv@4 referenced in function "void __cdecl do_display(void)" (?do_display@@YAXXZ)

我可能已经跟踪并在GL.h中找到了他们的定义如下:

WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v);
WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v);
WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);
WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v);
WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z);

我该如何解决这个链接问题?

1 个答案:

答案 0 :(得分:3)

首先,为了澄清你似乎遇到的一些重大困惑,这里有一些关于你所谈论的内容的信息。

<强> 1。 OpenGL不是软件

OpenGL是低级图形API的规范,是描述和定义由 OpenGL架构审查委员会(ARB)创建和维护的系统的抽象文档)。当它成为软件时,是某人实现规范。通常,特别是在Windows上,实现中包含各自GPU的驱动程序,例如: AMD的Catalyst和NVIDIA的GeForce驱动程序。

<强> 2。 GLUT

GLUT是一个小型,跨平台的GUI框架,能够创建OpenGL上下文并显示光栅化的结果等。除了能够在OpenGL开发中使用外,GLUT不是OpenGL规范的一部分。

* 注意: * GLUT非常非常陈旧且过时。请改用FreeGLUT

第3。什么是opengl32.lib和opengl32.dll?

最初,微软是ARB的成员。当他们分开并决定指定Direct3D(作为DirectX的一部分)时,他们仍然提供并仍然执行OpenGL 1.1的实现 - 这就是驻留在 opengl32.dll 中的内容。 lib 是所谓的导入库,它告诉链接器如何在运行时解析库符号。有关详情,请参阅this

除了OpenGL 1.1子集之外,opengl32.dll还实现了对窗口系统的大部分OpenGL绑定,称为 WGL 。请查看this了解更多信息。

此外,AFAIR,Microsoft的实现是一个纯软件实现 - 即一切都在CPU上完成。

<强> 4。您如何获得更新的功能?

正如我已经提到的,你安装了带有OpenGL实现的GPU驱动程序。目前,分别针对NVIDIA和AMD GPU实现了OpenGL 4.4和4.3。 Windows确定的方式是使用由安装的驱动程序设置的注册表项 - 也称为 OpenGL可安装客户端驱动程序(OpenGL ICD)。有关详情,请参阅this。在运行时,当您(或某些工具包如GLUT)创建上下文时,Windows将加载驱动程序提供的实现。

之后,由wglGetProcAddress确定的每个入口点都取自相应的OpenGL实现。例如,对于NVIDIA GPU,包含实现的DLL名称为nvogl64.dll

如果要访问新功能,则需要完全按照上述步骤操作,即从加载的DLL中检索指向函数的指针,或使用像glLoadGen生成的OpenGL扩展加载器或准备使用GLEW之类的加载器。 (个人提示:使用glLoadGen!)。

<强> 5。 Windows上OpenGL开发的最低基本设置是什么?

这是实际的答案。对于裸露的OpenGL演示,您甚至不需要像GLUT那样的东西。您可以仅使用Windows API,WGL和Windows提供的GL实现来实现内容。但是,只要您想超越OpenGL 1.1 需要硬件加速(99,9%的情况下可能就是这种情况),您将需要使用扩展加载程序或写入加载自己编写代码以获取最近的OpenGL优点。

如果您正在使用MSVC(++),即编译器作为Visual Studio的一部分,您绝对需要链接的是

  • opengl32.lib - 无论您的应用程序是64位还是32位应用程序,都无关紧要
  • 如果您正在使用GLU,则需要glu32.lib
  • 如果您使用的是像GLUT这样的GUI框架,则需要链接各自的导入库。例如,对于GLUT,它是glut32.lib。对于Qt4,它将是QtOpenGL4.lib,依此类推。
  • 链接某些OpenGL ICD!如上所述,ICD的入口点只能在运行时通过wglGetProcAddress动态确定。

如果您有其他问题或需要澄清,请发表评论。

编辑:另外,我建议您查看我们获得有关现代OpenGL的大量信息的OpenGL wiki