2015-03-02 465 views
-1

我無法在我的代碼中使用glXSwapBufferEXT,我得到了未聲明的標識符。但是,例如glXQueryDrawable的作品。OpenGL GLX_EXT_swap_control存在但無法鏈接函數

在我的cmake文件中,我連接了Opengl庫,並將它們包含在編譯器中。

在我的頭文件中,我包括GL/glx.h和GL/glxext.h。

運行glxinfo顯示GLX_EXT_swap_control存在,並且在我的應用程序中測試擴展還會在運行時顯示它的存在。

我在做什麼錯?我錯過了什麼嗎?

我已經安裝了的Quadro K5000 NVIDIA 346.47驅動程序

Linux的gcc4.9/clang3.5

+0

請告訴我爲什麼我的問題被拒絕投票?我發現它已被編輯,對不起,我的第三篇文章在這裏。但是,不要只是編輯和投票,你可以解釋和教導未來的改進,而不僅僅是打耳光。謝謝。 – Bazilikum 2015-03-02 19:25:59

+1

發佈[MCVE](http://stackoverflow.com/help/mcve)以及您正在使用的編譯命令。 – genpfault 2015-03-02 19:51:34

回答

4

您必須使用擴展機制查詢在運行時函數指針,試圖直接鏈接以glX 擴展功能不能保證工作。

請注意,我假設你想glXSwapIntervalEXT代替glXSwapBufferEXT因爲後者不存在,前者是GLX_EXT_swap_control定義的唯一功能,所以你可能就是這個意思。

如果你想手動做到這一點,你應該抓住latest glxext.h from opengl.orgPFNGLXSWAPINTERVALEXTPROC指針類型的定義,並使用它像這樣:

#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,如GLEW,除了GL extnesions還處理glXwgl擴展名,併爲你做了所有這些。

+1

謝謝,我現在明白這個機制好多了。 – Bazilikum 2015-03-02 21:58:29