static library project
假设你在你的项目A中想使用一个static library project, 可以使用以下的步骤
- 添加static library project
右击项目A,在弹出菜单中选择”Add Files to“,选择对应的.xcodeproj文件即可。或者直接把这个static library project的.xcodeproj拖拽到项目A中。
弄完后,static library project应该被自动打开了,如果没有,它就是被另外一个xcode 窗口中被打开了,必须先关闭掉,然后在项目A中打开。 - 添加build 依赖
在Targets->build Phases->Link Binary with Libraries 添加刚才的static library - 添加static library的头文件
在Targets->build settings->user header search paths设置static library的头文件搜索路径
其中要用到的一些xcode预定义变量,可以参考http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html - 如果项目A是non-arc,而static library是arc的,则需要以下操作
不能直接通过源文件进行编译,只能作为static library进行link
在Targets->build settings->build option 将LLVM GCC 4.2 改为Apple LLVM compiler 3.0
对使用了arc的源文件,在Targets->Build Phases->Compile Sources, 点击对应的源文件,添加编译选项-fobjc-arc
参考http://blog.cnrainbird.com/index.php/2012/03/13/object-c_kai_fa_zhong_hun_he_shi_yong_huo_bu_shi_yong_arc/ - static library里面有category, 在你的项目中使用这个category时,需要设置一个flag,否则category不会被连接进去
Targets->build settings->other Linker Flags , 添加-ObjC, 否则category不可用,最后运行的时候会出错
参考http://stackoverflow.com/questions/932856/calling-method-on-category-included-from-iphone-static-library-causes-nsinvalida - 添加linker flags需要注意的事项
Debug, Release, Any Architecture版本的,需要弄清楚你现在build的是哪个版本,然后在上面设置准确选项,一般把Any Architecture的去掉
之前在移植的时候,在Debug跟Release上设置了-fobjc-arc,但Any Architecture上没有设置,导致没有正确的link,最后删掉Any Architecture就行了
引言:
静态库是一个(.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也会报出 找不到相应的类,除非在代码中主动调用.
2:将静态库使用的相关资源拷贝的bundle里面.
3:抒写代码的时候在路径方面有所改变,如下:
- [UIImage imageNamed:@"PullTableView.bundle/arrowhead_up.png"]
4:这一点是我的建议,将捆绑包还是放在静态库的目录里. 然后在拖动到主工程中时,不要选择复制到执行区域.如下图设置即可:
八:当一个项目里面有两个Target都需要使用同一个静态库时,应该这样操作才可以正常使用:
因为在Frameworks里面只会生成一个.a 文件. 所以直接在Target Membership直接勾选即可.