iphone - 弱链接 C 函数

标签 iphone objective-c ios

我正在开发获取屏幕截图的静态库,从 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)) 

但它不起作用(不改变任何东西)。

最佳答案

您可以打开正在执行的应用程序并检查它是否链接到 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 */
}

关于iphone - 弱链接 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684232/

相关文章:

ios - 拖动时关闭键盘

ios - 在代码中配置 NSAppTransportSecurity

objective-c - MASShortcut - 默认值

ios - 条件绑定(bind)中的绑定(bind)值必须是可选类型 [IOS - SWIFT]

ios - Swift 委托(delegate) - 新手 3 ViewController

ios - 准备转至 UITabBarController 选项卡

iphone - 开始编辑时 Textview 无法向上移动

ios - 更改UIToolbar UIBarMetrics

ios - 带参数的本地化字符串在参数周围添加换行符和括号

ios - 如何在突出显示时更改 UIControl 的大小?