-1

我已经链接到 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);

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

4

1 回答 1

3

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

1.OpenGL不是软件

OpenGL 是低级图形 API的规范,是描述和定义由OpenGL 架构审查委员会(ARB) 创建和维护的系统的抽象文档。它成为软件的关键在于有人实现了规范。通常,尤其是在 Windows 上,实现包含适用于您各自 GPU 的驱动程序,例如 AMD 的 Catalyst 和 NVIDIA 的 GeForce 驱动程序。

2. 过剩

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

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

3、什么是opengl32.lib和opengl32.dll?

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

除了 OpenGL 1.1 子集之外,opengl32.dll 还实现了与窗口系统的大部分 OpenGL 绑定,称为WGL。检查更多

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

4. 如何获得更新的功能?

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

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

如果您想访问新功能,您要么需要完全按照上述方式进行操作,即从加载的 DLL 中检索指向函数的指针,要么使用 OpenGL 扩展加载器(如 glLoadGen 生成的加载器)或准备使用 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
  • 如果您使用一些 GUI 框架(如 GLUT),则需要链接到它们各自的导入库。例如,对于 GLUT,它是 glut32.lib。对于 Qt4,它将是 QtOpenGL4.lib 等等。
  • 不会针对某些 OpenGL ICD 进行链接!如上所述,ICD 的入口点只能在运行时通过wglGetProcAddress.

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

编辑:另外,我敦促您查看OpenGL wiki,我们在其中获得了大量有关现代 OpenGL 的信息。

于 2013-10-30T10:12:42.540 回答