【iOS】配置和使用靜態庫


上一篇 我們演示了了如何創建自己的靜態庫,最終生成多個.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.csdn.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM