OpenGL GLX_EXT_swap_control存在,但无法链接函数

OpenGL GLX_EXT_swap_control exists but can't link functions

本文关键字:链接 函数 存在 GLX EXT swap control OpenGL      更新时间:2023-10-16

我不能在代码中使用glXSwapBufferEXT,我得到了未声明的标识符。但例如,glXQueryDrawable是有效的。

在我的cmake文件中,我链接Opengl库,并为编译器包含它们。

在我的标题中,我包括GL/glx.h和GL/glxext.h

运行glxinfo表明GLX_EXT_swap_control存在,在我的应用程序中测试扩展也表明它在运行时存在。

我做错了什么?我是不是错过了什么?

我为Quadro K5000 安装了NVIDIA 346.47驱动程序

Linux gcc4.9/crang3.5

您必须使用扩展机制在运行时查询函数指针,尝试直接链接到glX扩展功能不能保证工作。

请注意,我假设您想要glXSwapIntervalEXT而不是glXSwapBufferEXT,因为后者不存在,并且前者是GLX_EXT_swap_control中定义的唯一函数,所以您可能是这个意思。

如果您想手动执行此操作,您应该从opengl.org获取最新的glxext.h来定义PFNGLXSWAPINTERVALEXTPROC指针类型,并像这样使用它:

#include "glxext.h"
/* function pointer for glXSwapIntervalEXT */
PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT=NULL;
/* later in your code */
if (/* GLX_EXT_swap_control supported */) {
   glXSwapIntervalEXT=(PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT");
}
/* Later, you can use it as if it were a function.
   You'll need a GL context for that */
glXSwapIntervalEXT(1);

然而,手动执行此操作会添加大量样板代码。您应该考虑使用像GLEW这样的OpenGL加载库,它除了处理GL扩展之外,还处理glXwgl扩展,并在后台为您完成所有这些操作。