新 xcode5.1 即简介静态库

Xcode中5.1.dmg下载地址

http://pan.baidu.com/s/1jGJpKm6

 

1,新建框架及图书馆工程

我起名叫ShowInfo,下面为其源码

showInfo.h

=========================

#进口<Foundation/Foundation.h> @接口ShowInfo:NSObject的+(无效)showInfo; @结束





=========================

showInfo.m

=========================

#导入“ShowInfo.h” @执行ShowInfo +(无效)showInfo {     的NSLog(@“你好YX”); } @结束








=========================

 

2,分别制作真机以及模拟器使用的静态库

如上图所示,调试,对iPhoneOS以及调试 - iphonesimulator都有一个静态库文件

 

3,合并静态库

合并静态库的格式如下所示

脂创建  /绝对路径/ libShowInfo.a   /绝对路径/ libShowInfo.a   输出 /绝对路径/ libShowInfo.a

大功告成!

 

以下为的Xcode 5.1测试结果

无意间发现的Xcode 5.1中的静态库搜索路径中的路径为 $(PROJECT_DIR)  ,以后再也不会出现换台电脑后重新设置库搜索路径的问题了.

以下为的Xcode 5.0测试结果

 

 

问:如果有很多文件,如何编译成一个静态库文件?

如上例中,我将一个操作CoreData的很多文件打包成一个静态库,编译时把需要导出的头文件导出来即可(图片右下部分).

 

问:为什么在使用静态库时报错呢?

极有可能你的静态库文件中含有类目文件,就以上图中为例,有很多的类目文件,解决方法在其它链接器标记是添加-ObjC的标签,如下图所示

原理解析如下  http://stackoverflow.com/questions/2567498/objective-c-categories-in-static-library/2615407#2615407

解决方案:  由于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可能未正确添加。当我删除它,然后再次执行步骤添加:

  1. 拖放在应用程序项目,请项目的lib文件(或将其添加项目 - >添加到项目...)。
  2. 点击箭头的lib项目图标 - 显示mylib.a上的文件名,拖动此mylib.a上的文件拖放到目标 - >链接的二进制库群。
  3. 在拳头页面(一般)打开目标信息,并添加我的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

 

问:合并静态库时为什么会报错?

请将你正在使用的Xcode中的APP文件名字修改成Xcode.app,否则在终端合并库文件时会报错。

标签:  的iOS
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值