解决方案: 由于Xcode的4.2的 ,你只需要到被链 接对库中的应用程序(而不是库本身),并单击Project Navigator中的项目,单击您的应用程序的目标,然后建立设置,然后搜索“其他连接选项“,单击+按钮,并添加”-ObjC的“。' - all_load'和'-force_load'不再需要。
详细信息: 我发现在各种论坛,博客和苹果的文档一些答案。现在,我尽量使我的搜索和实验简短摘要。
问题是由于(引用来自苹果技术问答QA1490 http://developer.apple.com/mac/library/qa/qa2006/qa1490.html):
Objective-C中不为每个函数定义的链接器符号(或方法,在Objective-C) - 相反,每个类只生成链接器符号。如果要扩展一个已经存在的类,类,链接器不知道的核心类实现的目标代码和类别执行相关联。这可以防止在产生的应用程序中创建的对象的响应是在类中定义的选择器。
和他们的解决方案:
要解决此问题,静态库应该通过-ObjC的选项给连接器。此标志会导致链接器加载的每个对象文件中定义一个Objective-C类或类别库。虽然这个选项通常会导致更大的可执行文件(因为加载到应用程序中其他对象的代码),它将使成功创建包含对现有的类类有效的Objective-C的静态库。
而且也有在iPhone开发常见问题的建议:
我该如何连接所有的Objective-C类中的静态库?设置其它链接器标记构建设置为-ObjC的。
和标志的说明:
- all_load 负载的静态归档库中的所有成员。
- ObjC的 负载实现一个Objective-C类或类的静态档案库中的所有成员。
- force_load(path_to_archive) 加载指定的静态归档库中的所有成员。注:-all_load部队要加载的所有存档的所有成员。此选项允许您针对特定的归档。
*,我们可以使用force_load减少应用程序二进制大小和避免冲突至极all_load可引起在某些情况下。
是的,它的工作原理与*。添加到项目中的文件。不过,我有麻烦与作为直接依赖库项目。但后来我发现,这是我的错 - 直接依赖projecct可能未正确添加。当我删除它,然后再次执行步骤添加:
- 拖放在应用程序项目,请项目的lib文件(或将其添加项目 - >添加到项目...)。
- 点击箭头的lib项目图标 - 显示mylib.a上的文件名,拖动此mylib.a上的文件拖放到目标 - >链接的二进制库群。
- 在拳头页面(一般)打开目标信息,并添加我的lib来依赖项列表
之后,所有工程确定。“-ObjC的”标志就足以在我的情况。
我也有兴趣与想法 http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html 博客。作者说他可以用从库类不设置-all_load或-ObjC的标志。他只是添加到类H / M档空虚类的接口/实现强制链接器使用此文件。是的,这招做的工作。
但作者也说,他甚至没有实例化虚拟对象。嗯......我已经找到了,我们应该显式地调用一些“真正的”代码类文件。因此,至少类的函数应该被调用。我们甚至不需要虚拟类。单c函数做同样的。
所以,如果我们写lib文件为:
/ / mylib.h 无效useMyLib (); @接口NSObject的(记录器)- (无效)logSelf ; @结束/ / mylib.m 无效useMyLib (){ 的NSLog (@ “什么也不做,只是为了制造mylib中联” ); } @实现NSObject的(记录器)- (无效)logSelf { 的NSLog (@ “自我为:%@” ,[ 自我介绍]); } @结束
如果我们调用useMyLib();在应用程序项目的任何地方,然后在任何类中,我们可以使用logSelf类的方法;
[ 自我logSelf ];
并在主题更多的博客:
http://t-machine.org/index.php/2009/10/13/how-to-make-an-iphone-static-library-part-1/
http://blog.costan.us/2009/12/fat-iphone-static-libraries-device-and.html