2011-05-09 71 views
0

我想使用的命令:的OpenGL - glBeginQuery没有宣布

glBeginQuery

glEndQuery

glGetQueryObjectiv

glGenQueries

但是编译器给我” ..was不声明“

我使用linux和我有这些头文件(这工作很好,直到现在)

  #include <GL/gl.h> 
      #include <GL/glu.h> 
      #include <GL/glut.h> 
      #include <GL/glx.h> 

      #include <X11/X.h>  
      #include <X11/keysym.h> 

有没有解决方案呢?

回答

3

查询函数在glext.h中声明。请注意,包含此文件不会奇迹般地初始化函数指针,也不会检查功能的可用性(尽管1.5功能几乎无处不在,但一个编写良好的程序不能简单地假定它工作正常)。您至少必须正确初始化指针,否则程序将崩溃并烧毁。

如果你不知道我说的是现在,或者如果你以任何方式不确定,下载GLEW。这会为你节省很多痛苦。

编辑:关于它是如何工作的更详细的解释是:超越核心1.2(或相信Linux的1.3)的功能只能通过函数指针机制来实现。为此,像glBeginQuery这样的函数将有一个名为PFNGLBEGINQUERYPROC的函数指针typedef,它用于初始化一个名为glBeginQuery的静态全局变量。你当然也可以自由地做其他任何事情(你可以把所有的函数指针放到一个结构体中,或者给它们愚蠢的名字),但这是最常用的。

您还必须检查正确的版本和/或扩展的支持,否则你不知道你想要的功能是否在所有实施。

GLEW 做一切对你那么它只是工作如果你这样做:

#include <GL/glew.h> 
    ... 
if (glewInit() != GLEW_OK) 
    fail_with_error(); 

旁注:你可以glext.h定义GL_GLEXT_PROTOTYPES生成原型,但这不是非常有用,因为它会导致链接器抱怨丢失的符号(实际上,我一直在想,为什么这会存在)。

+0

你好,我想包括,但仍然是相同的。(我已经GLEW从软件仓库安装)。我想实现从一本书的例子。 – George 2011-05-09 09:22:10

+1

@George:确保包含GLEW头并调用init函数,参见上面的更新回答。 – Damon 2011-05-09 09:39:01

+0

感谢您的帮助。使用glew.h它几乎ok.Now,它给了我“未定义的引用'_glewBeginQuery”。它不承认glBeginQuery>我试图删除glut.h但我当然没有识别代码中的glut命令。所以,我使用glew我不能使用过剩? – George 2011-05-09 09:53:14