我已经链接到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);
我该如何解决这个链接问题?
答案 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的一部分,您绝对需要链接的是
wglGetProcAddress
动态确定。如果您有其他问题或需要澄清,请发表评论。
编辑:另外,我建议您查看我们获得有关现代OpenGL的大量信息的OpenGL wiki。