上一篇 我们演示了了如何创建自己的静态库,最终生成多个.a文件,根据需要引用工程就可以直接使用静态库了,但是有个很麻烦的问题,模拟器用的库和真机的不是同一个,当我们切换的时候需要更换静态库,有两种方式可以改善这个问题
一、合并静态库
lipo –create Release-iphoneos/libsqlcipher.a Release-iphonesimulator/libsqlcipher.a –output libsqlcipher.a
合并后的.a库就可以通用了
二、配置工程库路径
配置路径和编译参数后xcode会自动找到路径下的库引入到项目
1、创建工程CalculatorTest,我们把编译好的静态库赋值到工程目录下
2、设置Library Search Path,添加下面两个参数
$(SRCROOT)/Libs/Debug$(EFFECTIVE_PLATFORM_NAME)
$(SRCROOT)/Libs/Release$(EFFECTIVE_PLATFORM_NAME)
$(SRCROOT):表示当前工程的根路径,可以在右边看到实际对应的路径
$(EFFECTIVE_PLATFORM_NAME):代表当前配置是OS,如果是模拟器则为-iphonesimulator,真机则为-iphoneos
一般第三方库只提供Release版本,如果只有Release版,则两个都设置Release即可
3、设置编译参数
Build Settings -> Linking -> Other Linker Flags
添加:-lCalculator
编译静态库的时候,xcode默认会自动把库名加上lib前缀
注:
1、前面加横杠'-',lib改为l
2、如果静态库中有category,那么需要添加 -ObjC 参数标识,否则可能会报:unrecognized selector sent to instance
3、参数说明(引用自:http://www.cnblogs.com/robinkey/archive/2013/05/27/3101095.html)
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载
4、编译方式(引用自:http://blog.****.net/zhangkongzhongyun/article/details/8047500)
静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即将XCode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As设置为"Objective-C++"
4、配置完成,添加头文件到工程
5、编译测试,调用静态库内部方法
调用成功
6、Demo
http://files.cnblogs.com/files/bomo/CompileStaticLibrary2.zip