11

Linux で OpenGL を使用するほとんどのアプリケーション (およびライブラリ)は、API に対して動的にリンクするのではなく、APIlibGL.soを使用して実行時にロードします。dlopen

なぜ彼らはこれを行うのですか?

私が想像できる唯一の理由は、グラフィック ドライバー ベンダーがlibGL異なるlibGL. (うーん、なぜそれらは ABI 非互換である必要があるのですか? また、そうであるとしても、なぜそれらを経由してロードするdlopenとこの問題が修正されるのでしょうか?)

とはいえ、それなりの理由があるのなら、私もそうしたい。を介してすべての OpenGL 関数をロードするオープンソースの C/C++ コードへのリンクを持っている人はいますdlopenか?

4

2 に答える 2

9

人々がこれを行う主な理由は2つあります。

  1. OpenGLを持たないシステムには賢明なエラーを与えることができます
  2. ベンダーは多くの異なる拡張機能を提供しており、ベンダーごとに異なるバイナリを使用せずに複数の拡張機能セットをサポートする唯一の正しい方法は、dlsymを使用してそれらをチェックすることです。GLEWは、これを行うための優れた方法を提供します。
于 2010-11-15T16:11:24.433 に答える
8

これは、GL 実装に静的にリンクする必要がないように作成されています。たとえば、OpenGL 3.0 以降で利用可能な glBindFragDataLocation をコードで使用している場合、OpenGL 2.1 以前では不可解なリンカー エラーで実行に失敗します。実装。

そのため、エントリ ポイントを動的に取得すると、実行時に適切なレンダリング パスを選択できます。

また、Windows では GL 関数 > 1.1 が必要です。

GLEW はこれを行います。libGL を dlopen せず、glXGetProcAddress/wglGetProcAddress/aglGetProcAddress を使用してドライバーから GL 関数ポインターを取得し、クロスプラットフォームです。

于 2010-11-15T20:33:17.020 に答える