2010-11-15 17 views
9

使用Linux上的OpenGL的大多數應用程序(和庫)在運行時使用dlopen API加載libGL.so,而不是動態鏈接它。Linux上的OpenGL:dlopen libGL.so

他們爲什麼這樣做?

我能想象的唯一原因是,這是因爲任何圖形驅動程序供應商都提供了不同的libGL,而且兩個不同的libGL可能與ABI不兼容。 (哼,爲什麼它們應該是ABI不兼容的?即使它們是,爲什麼通過dlopen加載它們可以解決這個問題?)

無論如何,假設有這樣一個很好的理由,我想做也是如此。有沒有人有鏈接到一個開源的C/C++代碼,通過dlopen加載所有的OpenGL函數,我可以包含到我的項目,而無需太多的調整?

+3

「*大多數使用Linux上的OpenGL的應用程序(和庫)在運行時使用dlopen *加載libGL.so」,該語句並非全部如此,特別是對於開放源代碼的僅限GL的遊戲。 – user502515 2010-11-25 23:12:10

回答

8

主要有兩個原因,有人這樣做:

  1. 你可以給一個合理的錯誤沒有的OpenGL
  2. 廠商提供了許多不同的擴展和唯一明智的方式來支持多套系統每個供應商沒有不同的二進制文件的擴展是使用dlsym來檢查它們。 GLEW提供了一個不錯的方式爲你做這個。
+0

那麼他們爲什麼不在其他平臺上做同樣的事情呢? – peoro 2010-11-15 17:29:30

+0

在Windows上,例如WGL提供了獲取擴展的函數指針的機制,它必須用於所有擴展:http://www.opengl.org/wiki/Platform_specifics:_Windows#wglGetProcAddress與調用dlsym基本相同,只是沒有打電話給dlopen – Flexo 2010-11-15 17:38:10

8

這是,這樣你就不必靜態鏈接到GL實現,例如,如果你的代碼使用glBindFragDataLocation,這是可在OpenGL 3.0的,更新的,它會失敗與一個神祕的連接運行OpenGL 2.1和更早版本的錯誤。

因此,動態獲取入口點允許您在運行時選擇apropiate呈現路徑。

另外,在GL功能> 1.1的Windows上需要它。

GLEW爲你做這件事,它不使用libGL,它使用glXGetProcAddress/wglGetProcAddress/aglGetProcAddress從驅動程序獲取GL函數指針,它是跨平臺的。