【iOS】配置和使用静态库

上一篇 咱们演示了了如何建立本身的静态库,最终生成多个.a文件,根据须要引用工程就能够直接使用静态库了,可是有个很麻烦的问题,模拟器用的库和真机的不是同一个,当咱们切换的时候须要更换静态库,有两种方式能够改善这个问题html

1、合并静态库sql

lipo –create Release-iphoneos/libsqlcipher.a Release-iphonesimulator/libsqlcipher.a –output libsqlcipher.a

  合并后的.a库就能够通用了xcode

 

2、配置工程库路径iphone

  配置路径和编译参数后xcode会自动找到路径下的库引入到项目测试

  一、建立工程CalculatorTest,咱们把编译好的静态库赋值到工程目录下ui

  

  二、设置Library Search Path,添加下面两个参数spa

   $(SRCROOT)/Libs/Debug$(EFFECTIVE_PLATFORM_NAME)    $(SRCROOT)/Libs/Release$(EFFECTIVE_PLATFORM_NAME)

    $(SRCROOT):表示当前工程的根路径,能够在右边看到实际对应的路径.net

    $(EFFECTIVE_PLATFORM_NAME):表明当前配置是OS,若是是模拟器则为-iphonesimulator,真机则为-iphoneos3d

    通常第三方库只提供Release版本,若是只有Release版,则两个都设置Release便可   code

    

  三、设置编译参数

    Build Settings -> Linking -> Other Linker Flags

      添加:-lCalculator

    编译静态库的时候,xcode默认会自动把库名加上lib前缀

    注:
      一、前面加横杠'-',lib改成l
      二、若是静态库中有category,那么须要添加 -ObjC 参数标识,不然可能会报:unrecognized selector sent to instance 

      三、参数说明(引用自: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须要指定要进行所有加载的库文件的路径,这样的话,你就只是彻底加载了一个库文件,不影响其他库文件的按需加载                

      

      四、编译方式(引用自:http://blog.csdn.net/zhangkongzhongyun/article/details/8047500
        静态库中采用ObjectC++实现,所以须要您保证您工程中至少有一个.mm后缀的源文件(您能够将任意一个.m后缀的文件更名为.mm),或者在工程属性中指定编译方式,即将XCode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As设置为"Objective-C++"

 

  四、配置完成,添加头文件到工程

     

  五、编译测试,调用静态库内部方法

  

    调用成功

 

  六、Demo

    http://files.cnblogs.com/files/bomo/CompileStaticLibrary2.zip

相关文章
相关标签/搜索