弱连接C函数

时间:2012-05-21 11:20:08

标签: 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)) 

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

2 个答案:

答案 0 :(得分: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 */
}

答案 1 :(得分:0)

这是一个很棒的代码链接,可以在不使用OpenGL库的情况下进行截屏。甚至OpenGL视图都以UIView开头,因此如果您正在进行全屏截图,这应该仍然有用。 http://www.icodeblog.com/2009/07/27/1188/

另外,如果它是您所追求的OpenGL视图部分的屏幕截图,那么我建议你仍然使用上面引用的代码,并简单地将其裁剪为你需要/想要的东西,否则你可能会失败在OpenGL视图中部分捕获像素的路径。如果您这样做,那么您的API用户已经在使用OpenGL,因此最有可能链接到框架。