使用 GLFW/GLEW 进行 OpenGL 编程
Posted
技术标签:
【中文标题】使用 GLFW/GLEW 进行 OpenGL 编程【英文标题】:OpenGL programming with GLFW/GLEW 【发布时间】:2016-03-18 15:58:07 【问题描述】:我想学习使用着色器,因此在 Netbeans(8.0.2 版)上创建了一个新的 C++ 项目。
我想包含本教程中所述的 GLFW 和 GLEW 库:http://www.learnopengl.com/#!Getting-started/Creating-a-window
我目前正在努力正确导入 glew。使用 #include <GL/glew.h>
时,编译器(我在 Windows10x64/Cygwin 控制台上使用 GNU g++)会抛出大量错误。 glu.h
似乎有问题。出于测试目的,我在 glew.h 中删除了 glu.h 的导入。这消除了错误,但也阻止了 openGL 完全加载(以 gl 开头的函数是“未定义的”,如glViewport
)。所以这不是解决办法。
在普通glew.h上调用编译器得到的输出:
g++ -m64 -c -g -Wall -I/cygdrive/C/Users/Erik/programming/Libraries/glew-1.13.0-win32/glew-1.13.0/include/ -I/cygdrive/C/Users/Erik/programming/Libraries/glfw-3.1.2.bin.WIN32/glfw-3.1.2.bin.WIN32/include/ -std=c++11 -MMD -MP -MF "build/Debug/Cygwin-Windows/startup.o.d" -o build/Debug/Cygwin-Windows/startup.o startup.cc
In file included from /cygdrive/C/Users/Erik/programming/Libraries/glew-1.13.0-win32/glew-1.13.0/include/GL/glew.h:1202:0,
from startup.cc:5:
/usr/include/w32api/GL/glu.h:68:79: error: expected ')' before '*' token
void APIENTRY gluQuadricCallback(GLUquadric *qobj,GLenum which,void (CALLBACK *fn)());
^
/usr/include/w32api/GL/glu.h:68:79: error: expected ')' before '*' token
/usr/include/w32api/GL/glu.h:68:79: error: expected initializer before '*' token
/usr/include/w32api/GL/glu.h:78:79: error: expected ')' before '*' token
void APIENTRY gluTessCallback(GLUtesselator *tess,GLenum which,void (CALLBACK *fn)());
^
/usr/include/w32api/GL/glu.h:78:79: error: expected ')' before '*' token
/usr/include/w32api/GL/glu.h:78:79: error: expected initializer before '*' token
/usr/include/w32api/GL/glu.h:94:75: error: expected ')' before '*' token
void APIENTRY gluNurbsCallback(GLUnurbs *nobj,GLenum which,void (CALLBACK *fn)());
^
/usr/include/w32api/GL/glu.h:94:75: error: expected ')' before '*' token
/usr/include/w32api/GL/glu.h:94:75: error: expected initializer before '*' token
/usr/include/w32api/GL/glu.h:96:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUquadricErrorProc)(GLenum);
^
/usr/include/w32api/GL/glu.h:97:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessBeginProc)(GLenum);
^
/usr/include/w32api/GL/glu.h:98:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessEdgeFlagProc) (GLboolean);
^
/usr/include/w32api/GL/glu.h:99:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessVertexProc)(void *);
^
/usr/include/w32api/GL/glu.h:100:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessEndProc)(void);
^
/usr/include/w32api/GL/glu.h:101:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessErrorProc)(GLenum);
^
/usr/include/w32api/GL/glu.h:102:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessCombineProc)(GLdouble[3],void*[4],GLfloat[4],void**);
^
/usr/include/w32api/GL/glu.h:103:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessBeginDataProc)(GLenum,void *);
^
/usr/include/w32api/GL/glu.h:104:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessEdgeFlagDataProc) (GLboolean,void *);
^
/usr/include/w32api/GL/glu.h:105:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessVertexDataProc)(void *,void *);
^
/usr/include/w32api/GL/glu.h:106:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessEndDataProc)(void *);
^
/usr/include/w32api/GL/glu.h:107:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessErrorDataProc)(GLenum,void *);
^
/usr/include/w32api/GL/glu.h:108:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUtessCombineDataProc)(GLdouble[3],void*[4],GLfloat[4],void**,void*);
^
/usr/include/w32api/GL/glu.h:109:24: error: expected ')' before '*' token
typedef void (CALLBACK *GLUnurbsErrorProc)(GLenum);
^
对我来说,(我不是 C++ 专业人士,因此在解释错误消息方面不是很好)似乎 CALLBACK
尚未定义。关于如何解决这个问题的任何想法?
【问题讨论】:
没有语言 C/C++。只有两种不同语言 C 和 C++。选择你实际使用的那个! 不要只使用链接。一个问题必须是独立的。学习How to Ask。 你能展示一个编译失败的代码的最小例子吗? 您确定包含所有必需的标题吗?编译器能找到它们吗?#include <GL/glew.h>
是否指向有效的,例如现有的,文件?
这个答案***.com/questions/19198244/… 可能就是你要找的:)
【参考方案1】:
我以某种方式解决了它(不漂亮,但至少以某种方式):
我尝试像link from @Louen 中所述导入windef.h
。
这删除了 CALLBACK 错误,但创建了一个新错误(关于 APIENTRY)。于是我搜索了windef.h的解决错误的部分,找到了:
#ifndef CALLBACK
#if defined(_ARM_)
#define CALLBACK
#else
#define CALLBACK __stdcall
#endif
#endif
然后我只是将其粘贴到我的文件中(而不是包括整个 windef.h)。
【讨论】:
以上是关于使用 GLFW/GLEW 进行 OpenGL 编程的主要内容,如果未能解决你的问题,请参考以下文章
使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常
opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明