【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

相關文章
相關標籤/搜索