解决方案:从 Xcode 4.2 开始,您只需转到链接库的应用程序(而不是库本身),然后单击项目导航器中的项目,单击应用程序的目标,然后构建设置,然后搜索“其他链接器标志” ”,单击 + 按钮,然后添加“-ObjC”。不再需要“-all_load”和“-force_load”。
Details:我在各种论坛、博客和苹果文档中找到了一些答案。现在我尝试对我的搜索和实验做一个简短的总结。
问题是由(引用自苹果技术问答QA1490)引起的https://developer.apple.com/library/content/qa/qa1490/_index.html https://developer.apple.com/library/content/qa/qa1490/_index.html):
Objective-C 没有定义链接器
每个函数(或方法,
在 Objective-C 中) - 相反,链接器
仅为每个生成符号
班级。如果您延长已有的
带有类别的类,链接器会这样做
不知道关联目标代码
核心类的实现和
类别实施。这
防止在以下位置创建对象
响应产生的申请
到定义在的选择器
类别。
以及他们的解决方案:
为了解决这个问题,静态
库应该传递 -ObjC 选项
到链接器。该标志导致
链接器加载每个目标文件
定义一个库
Objective-C 类或类别。尽管
此选项通常会导致
更大的可执行文件(由于额外的
目标代码加载到
应用程序),它将允许
成功创建有效
Objective-C 静态库
包含现有类别
类。
iPhone开发FAQ中也有推荐:
如何链接所有 Objective-C
静态库中的类?设置
其他链接器标志构建设置为
-ObjC。
和标志说明:
-all_load加载静态归档库的所有成员。
-ObjC加载实现静态归档库的所有成员
Objective-C 类或类别。
-强制加载(存档路径)加载指定静态的所有成员
档案库。注意:-all_load
强制所有档案馆的所有成员
被加载。此选项允许您
定位特定的存档。
*我们可以使用force_load来减少应用程序二进制文件的大小并避免all_load在某些情况下可能导致的冲突。
是的,它适用于添加到项目中的 *.a 文件。
然而,我在将 lib 项目添加为直接依赖项时遇到了麻烦。但后来我发现这是我的错——直接依赖项目可能没有正确添加。当我删除它并再次添加步骤时:
- 将 lib 项目文件拖放到应用程序项目中(或使用“项目”->“添加到项目...”添加它)。
- 单击 lib 项目图标上的箭头 - 显示 mylib.a 文件名,将此 mylib.a 文件拖放到 Target -> Link Binary With Library 组中。
- 在第一页(常规)中打开目标信息并将我的库添加到依赖项列表中
之后一切正常。 “-ObjC”标志对我来说就足够了。
我也对来自的想法感兴趣http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html http://iphonedevelopmentexperiences.blogspot.com/2010/03/categories-in-static-library.html博客。作者说他可以使用 lib 中的类别,而无需设置 -all_load 或 -ObjC 标志。他只是将空虚拟类接口/实现添加到类别 h/m 文件中,以强制链接器使用此文件。是的,这个技巧可以做到这一点。
但作者还说他甚至没有实例化虚拟对象。嗯……正如我发现的,我们应该从类别文件中显式调用一些“真实”代码。所以至少应该调用类函数。
我们甚至不需要虚拟类。单个 c 函数执行相同的操作。
因此,如果我们将 lib 文件编写为:
// mylib.h
void useMyLib();
@interface NSObject (Logger)
-(void)logSelf;
@end
// mylib.m
void useMyLib(){
NSLog(@"do nothing, just for make mylib linked");
}
@implementation NSObject (Logger)
-(void)logSelf{
NSLog(@"self is:%@", [self description]);
}
@end
如果我们调用 useMyLib(); App项目中的任何地方
那么在任何类中我们都可以使用 logSelf 类别方法;
[self logSelf];
还有更多有关主题的博客:
http://t-machine.org/index.php/2009/10/13/how-to-make-an-iphone-static-library-part-1/ 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 http://blog.costan.us/2009/12/fat-iphone-static-libraries-device-and.html