OpenGL GLX_EXT_swap_control 存在但无法 link 运行

OpenGL GLX_EXT_swap_control exists but can't link functions

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

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

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

运行 glxinfo 显示 GLX_EXT_swap_control 存在,并且在我的应用程序中测试扩展也显示它在运行时存在。

我做错了什么?我错过了什么吗?

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

Linux gcc4.9/clang3.5

你必须使用扩展机制在运行时查询函数指针,试图直接link到一个glX 扩展功能不保证有效。

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

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

#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);

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