19

我用我的 glu 和 gl 头文件构建了一个 OpenGL 程序,默认包含在 windows 7 专业版中。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须在我的项目中包含 glew 标头。完成此操作后,我遇到了一些未解决的外部符号错误。

所以,现在我真的很困惑。我之前在我的程序中使用过 glBegin 和 glEnd 语句。现在我必须使用 glBindBuffers 和 glGenBuffer 等,但我得到未解决的外部符号错误,如下所示:

1>cWindows.obj : error LNK2001: unresolved external symbol __imp___glewBindBuffer
1>cMdlLoader.obj : error LNK2001: unresolved external symbol __imp___glewBindBuffer
1>cMdlLoader.obj : error LNK2001: unresolved external symbol __imp___glewBufferData
1>cMdlLoader.obj : error LNK2001: unresolved external symbol __imp___glewGenBuffers

这里有没有人可以解释这些头文件之间的区别以及我对它们的处理?

我看了很多次,但在不同的网站上有更多令人困惑的词,比如“glee”或“glut”。

4

2 回答 2

50

你在这里混合了 3 种不同的东西:

  1. OpenGL
  2. 不属于 OpenGL 的 GL Utilities (GLU)
  3. 和 GL 扩展牧马人 (GLEW)

GLEW 和 GLU 是完全不同的东西,你不能用另一个代替。

GL/gl.h是基本的 OpenGL 头文件,它为您提供 OpenGL-1.1 函数和令牌声明,甚至更多。对于超过 1.1 版的任何内容,您必须使用 OpenGL 扩展机制。由于这是一项无聊而乏味的任务,因此 GLEW 项目已将其自动化,该项目提供了一个易于使用的库中打包的所有脏细节。这个库的声明可以在头文件中找到GL/glew.h。由于没有基本 OpenGL 的 OpenGL 扩展没有意义,因此 GLEW 标头隐式包含常规 OpenGL 标头,因此GL/glew.h您不再需要包含GL/gl.h.

然后是 GLU,一组方便的方法,顺便说一句,它们已经严重过时,不应该在任何现代 OpenGL 程序中使用。没有现代 GLU,所以别管它了。无论如何,它的声明由标题GL/glu.h(您所询问的那个)提供。

您得到的错误与包含文件无关。这些是链接器错误。仅仅包括声明只是工作的一半。另一半是链接实际定义,而那些不在库文件头中的定义;libglew.solibglew.a在 *nix 操作系统上,glew.libglew32.libglews.libglew32s.lib在 Windows 上。如果不使用静态版本(没有“s”的版本),您还必须安装正确的 DLL。

因此,要使用 GLEW,您需要包含标头并将其添加到链接器选项中的库列表中。此外,您必须glewInit();在程序中获得 OpenGL 上下文后调用。

于 2012-08-25T14:15:22.937 回答
34
  • gl:这是 OpenGL 1.1 版的基本头文件。这意味着如果您想使用 1.1 版以外的任何功能,您必须在此添加任何扩展库。
  • glew:OpenGL 扩展牧马人库。这是一个用于加载 OpenGL 扩展功能的跨平台库。当你初始化这个库时,它会在运行时检查你的平台和显卡,以了解你的程序可以使用哪些功能。
  • glu:这是 OpenGL 实用程序库,很久没有更新了。不需要使用这个头文件。
  • glut:用于窗口 API 的 OpenGL 实用工具包。这适用于中小型 OpenGL 程序。如果您需要更复杂的窗口库,请使用原生窗口系统工具包,如 GTK 或 Qt for linux 机器。
  • glfw:OpenGL 框架工作。另一个用于创建窗口和处理事件的多平台库。FreeGlut 可以用作替代品。glfw 专为游戏开发而设计。
  • glm : OpenGL 数学。它有助于实现向量和矩阵运算。

我对OpenGL的东西很陌生,所以如果我错了,请纠正我。

于 2014-02-21T23:07:02.423 回答