引言:
静态库是一个(.a)为后缀的文件,它由Xcode编译生成.并且,库中只能存放代码,如果编译静态库的工程中有其他资源是无法一起编译到静态库中.
静态库有点类似Windows中的Dll文件.做过Windows桌面应用的人应该很熟悉.静态库出现的主要目的是为了让代码可以在多个地方重用.
此篇主要记录在iOS中使用静态库时遇到的问题汇总和解决方案.
如何创建一个静态库:
1:主工程关联静态库具体步骤
一:让静态库与项目工程关联起来
二:让项目工程写书写代码时,能够得带静态库中的头文件提示
三:为保证在修改静态库中的代码编译运行后能够每次都取用最新的静态库而进行如下设置(非必要设置)
Full Path 需要选择 DerivedData 文件夹里面 具体编译后所生成的 静态库文件,这样可以保证每次都使用最新的静态库文件
四:Library Target -> Build Settings -> Build Active Architecture Only
此项在Debug 和Release 模式下 需要设置 为 NO 否则会出现 在使用库里面的类文件时 找不到的错误警告
二:解决静态库无法使用资源文件的方式:
首先,所有的资源文件都依旧依附在静态库中,然后对需要使用的工程传入资源文件的引用即可.
将需要使用的资源文件拖动到工程中以后出现如下图中的设置选项:
三:静态库使用其他静态库的资源时,可直接设置 Header Search Path 即可,前提保证主工程都引用了这些静态库
四:解决在静态库中 使用 Category(类别) 产生的Crash
在调用静态库的主工程中进行如下设置即可解决问题:
Project->Build Settings->Other Linker Flags 添加值: -all_load
注:这种设置方法会让所有与主工程有关的静态库和框架都加载其中的Category.
如图:
参考文章:
http://blog.csdn.net/leonpengweicn/article/details/6799994
Category 的使用参考:
http://blog.csdn.net/sanpintian/article/details/7406180
http://www.54xue.com/w/70/n-30670.html
如果要在类别中保存变量,可以参考以下文章:
http://www.cnblogs.com/liping13599168/archive/2012/09/13/2682664.html
解决讯飞语音框架导入后产生编译不通过的解决方案:(将静态库单一设置其加载Category).
参考帖子:
http://dev.voicecloud.cn/bbs/forum.php?mod=viewthread&tid=4154&extra=&page=1
1.去掉-ObjC -all_load参数(这个参数会强制所有的静态链接库都加载其中的category);
2.改为逐一加载Three20的各个静态库,即修改链接参数(Other Linker Flag)为如下形式:
-force_load $(BUILT_PRODUCTS_DIR)/libThree20.a
如下图:
五:如果你将整个文件切换到了其他目录后,XCode编译时可能产生目录找不到的警告,如下图:
解决方法如下:
确定 Library Search Paths 的路径是否指向正确:
六: Unknown class MyClass in Interface Builder file. 的解决办法
设置 Other Linker Flag 的 -all_load
在使用静态库时,如果没有设置-all_load . 那么主工程在编译时是不会检测是否引用应该引用的框架(framework).
但是使用是没问题的,但是遇到需要框架才能执行的代码会崩溃,另外xib也会报出 找不到相应的类,除非在代码中主动调用.
七:静态库中的资源使用和管理的最佳解决方案.
使用Bundle捆绑包的方式来使用和管理资源.
步骤如下:
1:新建一个文件夹,将其命名为xxx.bundle. 以后 Mac自定识别到并标识为捆绑包.
2:将静态库使用的相关资源拷贝的bundle里面.
3:抒写代码的时候在路径方面有所改变,如下:
[UIImage imageNamed:@"PullTableView.bundle/arrowhead_up.png"]
4:这一点是我的建议,将捆绑包还是放在静态库的目录里. 然后在拖动到主工程中时,不要选择复制到执行区域.如下图设置即可:
八:当一个项目里面有两个Target都需要使用同一个静态库时,应该这样操作才可以正常使用:
因为在Frameworks里面只会生成一个.a 文件. 所以直接在Target Membership直接勾选即可.