使用 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 社区中获取访问冲突异常

glfw 包含了opengl吗

opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明

使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突

OpenGL01 搭建opgl环境

GLFW/GLEW C++ (atioglxx.dll)