我如何摆脱 glu.h 中的这些编译器错误?

Posted

技术标签:

【中文标题】我如何摆脱 glu.h 中的这些编译器错误?【英文标题】:how do i get rid of these compiler errors in glu.h? 【发布时间】:2013-10-05 13:17:18 【问题描述】:

尝试在带有 netbeans 和 cygwin 4.8.1 的 64 位 Windows 8 上使用此 tutorial。

我收到很多这样的错误:/usr/include/w32api/GL/glu.h:68:79: error: expected ‘)’ before ‘*’ token.

关于这样的语句:void APIENTRY gluQuadricCallback(GLUquadric *qobj,GLenum which,void (CALLBACK *fn)());

错误消息上的指针指向 fn() 之前的 *。

编辑:包括 windef.h 会消除编译器错误消息。

我留下了一堆未定义的引用,例如:glfwInit

edit2:使用 André Fischer 的想法,我可以得到一个干净的编译(你需要为链接器添加目录和 -l 选项)。

我现在有一个:在搜索 -lopengl32 时跳过不兼容的 ../../../../../Windows/SysWOW64/opengl32.dll 和:对 `_imp 的未定义引用em>_vsnprintf'。所以看起来我有一个 32/64 位问题和一个未定义的外部。

必须有一种更明智的方法才能让 opengl 在 Windows 上运行。

【问题讨论】:

教程的哪一点?这行 glu.h 说了什么? 第一个教程(tutorial01_first_window)。该行说: void APIENTRY gluQuadricCallback(GLUquadric *qobj,GLenum which,void (CALLBACK *fn)()); 我会怀疑CALLBACK 的预处理器定义。它通常在系统头文件中定义,以定义回调的默认调用约定,但如果定义不正确,就会发生这种事情。 windef.h 通常定义为__stdcall 包括 windef.h 帮助。请参阅编辑。 所以,现在您错过了所需的库。并显示确切的错误消息(或某些部分,如果它们看起来都相似)。 【参考方案1】:

我假设您的意思是 Tutorial 1: Opening a Window 并且正在使用 Netbeans 的内置构建系统而不是 CMake。

包含头文件的顺序很重要 (source)。试试这样:

#include <windef.h> // According to comments above
#include <GL/glew.h> // Before any gl headers
#include <GL/gl.h>

//#include <GL/glext.h> // Linux headers
//#include <GL/wglext.h> // Windows headers - Not sure which ones cygwin needs. Just try it

#include <GL/glu.h> // Always after gl.h
#include <GL/glfw.h> // When all gl-headers have been included

在您的项目目录中创建一个名为“include”的目录,其中包含一个子文件夹“GL”。

从GLFW Download Site 获取二进制文件(32 位,MinGW)并将 .dll/.so 放入您的构建文件夹(或将它们提取到某处并将它们添加到搜索目录)并将头文件放入“include /GL”。

本教程中的 glfw 代码也有些过时了;它不再适用于 glfw3。 您必须使用 GLFW 的 conversion guide/try this version 更新它(我无法测试,因为我目前不在家)或使用 glfw2。

最后下载 GLEW sources 并按照 README.txt 中的说明进行构建。将 .dll/.so 放入您的构建文件夹(或添加到搜索目录),将头文件放入“include/GL”。

将以下内容添加到您的编译器标志中:

-Iinclude/

最后将以下参数添加到您的链接器:

-L/lib -lglu32 -lopengl32 -lGL -lGLU -lglfw -lglew

你现在应该可以编译教程了。

编辑:添加了构建 GLEW、GLFW 的说明并完成了我的回答,包括从头开始构建所有内容。 Edit2:链接的 glfw3 版本的教程代码。 Edit3:添加了缺少的链接器选项。

【讨论】:

我按照你的建议做了大部分,但我仍然得到编译错误,比如 GLFW_WINDOW 没有在这个范围内声明,'glfwEnable' 没有在这个范围内声明,函数的参数太少' void glfwSwapBuffers(GLFWwindow*)' 这很可能是因为您尝试将 glfw3 与 glfw2-api 一起使用。 glfwEnable 现在是 glfwSetInputModeGLFW_WINDOW 已被弃用,现在已被删除,glfwSwapBuffers 需要一个指向您想要的窗口的指针将缓冲区交换到。有关创建 glfw 窗口的新方法,请参阅this creating a window guide for glfw3。有关所有更改的完整列表,我建议查看我之前发布的conversion guide。 我已经链接到本教程的修改版本,在我的回答中应该可以使用。 修改后的版本经过一些转换更改后编译。我现在无法让 netbeans 找到库。 使用这篇文章有点运气:***.com/questions/14237915/… - 现在它找到了 glfw3 和 glew32 库。现在需要做的就是找到并添加opengl库

以上是关于我如何摆脱 glu.h 中的这些编译器错误?的主要内容,如果未能解决你的问题,请参考以下文章

没有“glu.h”和“windows.h”,GLFW 无法编译

如何摆脱 PL/SQL 程序中的编译错误?

如何摆脱 Visual Studio 中的错误?

如何摆脱错误?

codeblocks 中怎么用c语言调用 opengl

摆脱 C# 中的预编译器指令