5

我正在开发获取屏幕截图的静态库,并且从 OpenGL 应用程序中获取它们需要特殊处理。

当客户端应用程序链接到我的静态库时,它必须添加我的库使用的框架,例如获取 OpenGL 屏幕截图,即使客户端应用程序不使用 OpenGL,它也必须与 OpenGLES.framework 链接,这很糟糕。如果客户端已与 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 回答