iOS靜態庫(配置二)

一、合併靜態庫

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章