2010-11-15 22 views
9

Die meisten Anwendungen (und Bibliotheken), die OpenGL unter Linux verwenden, laden zur Laufzeit unter Verwendung der API dlopen, anstatt dynamisch dagegen zu verlinken.OpenGL unter Linux: dlopen libGL.so

Warum machen sie das?

Der einzige Grund, den ich mir vorstellen kann ist, dass es weil jeder Grafiktreiber-Hersteller eine andere libGL bietet, und zwei verschiedene libGL könnte ABI inkompatibel sein. (Nun, brumm, warum sollten sie ABI-inkompatibel sein? Und selbst wenn sie das sind, warum würde das Laden dieses Problems behoben werden?)

Egal, es gibt einen guten Grund, dies zu tun, würde ich gerne tun das auch. Hat jemand einen Link zu einem Open Source C/C++ - Code, der alle OpenGL-Funktionen über dlopen lädt, die ich zu meinem Projekt hinzufügen kann, ohne zu viele Tweaks zu benötigen?

+3

"* Die meisten Anwendungen (und Bibliotheken), die OpenGL unter Linux verwenden, laden libGL.so zur Laufzeit mit dlopen *", diese Aussage ist nicht ganz richtig, besonders für Open-Source-Nur-GL-Spiele. – user502515

Antwort

8

Es gibt zwei Hauptgründe, warum Menschen dies tun:

  1. Sie können einen sinnvollen Fehler für Systeme geben, die OpenGL nicht
  2. Anbieter bieten viele verschiedene Erweiterungen und den einzigen vernünftigen Weg, um mehrere Sätze zu unterstützen Bei Erweiterungen ohne verschiedene Binärdateien pro Anbieter wird dlsym verwendet, um nach ihnen zu suchen. GLEW bietet eine nette Möglichkeit, dies für Sie zu tun.
+0

Warum machen sie das nicht auch auf anderen Plattformen? – peoro

+0

Unter Windows zum Beispiel bietet WGL einen Mechanismus zum Abrufen von Funktionszeigern für Erweiterungen, der für alle Erweiterungen verwendet werden muss: http://www.opengl.org/wiki/Platform_specifics:_Windows#wglGetProcAddress das ist im Grunde das gleiche wie das Aufrufen von dlsym, nur ohne den Aufruf von dlopen – Flexo

8

Dies gemacht wird, so dass Sie statisch nicht Implementierung einer GL haben zu verknüpfen, zum Beispiel, wenn Ihr Code verwendet glBindFragDataLocation, die auf OpenGL 3.0 und neueren verfügbar ist, wäre es nicht mit einem kryptischen Linker laufen Fehler bei OpenGL 2.1 und früheren Implementierungen.

Wenn Sie also Einstiegspunkte dynamisch erhalten, können Sie den geeigneten Rendering-Pfad zur Laufzeit auswählen.

Außerdem ist es unter Windows für GL-Funktionen> 1.1 erforderlich.

GLEW tut dies für Sie, es öffnet nicht libGL, es verwendet glXGetProcAddress/wglGetProcAddress/aglGetProcAddress, um GL-Funktionszeiger vom Treiber zu erhalten, und es ist plattformübergreifend.