C++ OpenGL GLX_EXT_swap_控件存在,但可以';t链接函数

C++ OpenGL GLX_EXT_swap_控件存在,但可以';t链接函数,c++,opengl,cmake,nvidia,C++,Opengl,Cmake,Nvidia,我不能在代码中使用glXSwapBufferEXT,我得到了未声明的标识符。但例如,glXQueryDrawable可以工作 在我的cmake文件中,我链接Opengl库,并将它们包含在编译器中 在我的标题中包括GL/glx.h和GL/glxext.h 运行glxinfo显示GLX_EXT_swap_控件存在,在我的应用程序中测试扩展也显示它在运行时存在 我做错了什么?我错过什么了吗 我已经为Quadro K5000安装了NVIDIA 346.47驱动程序 Linux gcc4.9/clang3

我不能在代码中使用glXSwapBufferEXT,我得到了未声明的标识符。但例如,glXQueryDrawable可以工作

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

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

运行glxinfo显示GLX_EXT_swap_控件存在,在我的应用程序中测试扩展也显示它在运行时存在

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

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

Linux gcc4.9/clang3.5

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

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

如果要手动执行此操作,应获取
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);

但是,手动执行此操作会添加大量样板代码。你应该考虑使用类似的方法,除了GL ExtEngices还处理<代码> GLX和 WGL扩展,并在引擎盖下为你做所有这些。请告诉我为什么我的问题已经被否决了?我看到它被编辑了,对不起,这是我的第三篇文章。但是,你可以为将来的改进进行解释和教学,而不是仅仅编辑和否决投票,而不是只是拍拍屁股就走。谢谢。发布一篇文章和你正在使用的编译命令。谢谢,我现在更了解这个机制了。