5

スクリーンショットを取得する静的ライブラリを開発していますが、OpenGL アプリケーションからスクリーンショットを取得するには特別な処理が必要です。

クライアント アプリケーションがスタティック ライブラリにリンクする場合、ライブラリで使用されるフレームワークを追加する必要があります。たとえば、OpenGL のスクリーンショットを撮る場合などです。クライアントが OpenGLES.framework とリンクしており、OpenGL からのスクリーンショットの取得を動的に有効にしている場合、ライブラリをチェックインしようとしています。

問題は、次のような C 関数を使用しようとするとコンパイル エラーが発生することです。

if(&glReadPixels != NULL) {
    glReadPixels(0, 0, size.width, size.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
}

ご覧のとおり、メソッドの存在を確認できますが、リンカー エラーが発生しないように呼び出すにはどうすればよいでしょうか。ライブラリでクライアントをコンパイルすると、次のようになります。

Undefined symbols for architecture i386:
"_glReadPixels", referenced from:
  +[TakeScreenshotUtil takeOpenGLScreenshotWithContext:layerSize:] in libScr-iOS.a(TakeScreenshotUtil.o)

私は使用しようとしています

__attribute__ ((weak)) 

しかし、それは機能しません (何も変わりません)。

4

2 に答える 2

1

実行中のアプリを開いて、OpenGL にリンクしているかどうかを確認できます。まず、アプリを -rdynamic (または同等の Apple の GCC が理解できるもの) で再コンパイルします。次に、次のコードを使用して関数を見つけます。

#import <dlfcn.h>

void (*_glReadPixels)(int, int, float, float, int, int, void *);
_glReadPixels = dlsym(NULL, "glReadPixels");
if (_glReadPixels != NULL) {
    /* take screenshot */
}
于 2012-05-22T16:00:12.637 に答える
0

これは、OpenGL ライブラリを使用せずにスクリーンショットを作成するための優れたコード セットへのリンクです。OpenGL ビューでさえ UIView で始まるため、フル スクリーンのスクリーンショットを作成している場合でも、これは機能するはずです。 http://www.icodeblog.com/2009/07/27/1188/

また、それが OpenGL ビューの一部のスクリーンショットである場合は、上記のコードを引き続き使用し、必要なもの/必要なものに切り詰めることをお勧めします。それ以外の場合は、 OpenGL ビュー内のピクセルの部分キャプチャを取得します。ただし、これを行っている場合、API のユーザーは既に OpenGL を使用しているため、とにかくフレームワークにリンクしている可能性があります。

于 2012-05-22T15:32:47.090 に答える