iOS靜態庫開發制作

庫的種類

  • 開源庫

  • 閉源庫


閉源庫分類

  • 動態庫

    • 鏈接時不復制,程序運行時由系統動態加載到內存中,供程序調用。
    • 系統只加載一次,多個程序共用,節省內存。(使用自制動態庫的程序不能上傳Appstore,WWDC大會上,蘋果對iOS 8開放了加載dylib的接口,開放了動態庫掛載,但是很少用)
    • eg:*.dylib(iOS9取消了.dylib,使用.tbd替代) 和 *.framework
  • 靜態庫

    • 對于老舊的MRC實現的功能,可以通過編譯成靜態庫文件在ARC環境下運行。
    • 方便代碼移植,代碼保密。
    • .framework 靜態庫制作需要將build settings -> Mach-O Type 設置成static Library,因為framework默認是動態庫。
    • eg:*.a 和 *.framework

關于架構

  • 模擬器架構:
     i386 : 32位 4s和5 
     x86_64: 64位 5s之后機型
    
  • 真機架構:
     armv7 : 32位 4s/4  (靜態庫只要支持armv7,就可以跑在armv7s架構上)
     armv7s: 5/5c 
     arm64 : 64位 5s以后機型
    
  • 架構的兼容:
  • 選擇target -> build active architecture only (只編譯活躍的架構) -> NO


廢話不多說,直接上手

    1. 新建工程


      新建工程.png
    1. .h 聲明


      WZTool.h
    1. .m 實現


      WZTool.m
    1. 靜態庫的生成


      Edit Scheme
開發模式和生產模式
查看靜態庫

調試版本 VS 發布版本

  • 調試版本會包含完整的符號信息,以方便調試
  • 調試版本不會對代碼進行優化
  • 發布版本不會包含完整的符號信息
  • 發布版本的執行代碼是進行過優化的
  • 發布版本的大小會比調試版本的略小
  • 在執行速度方面,發布版本會更快些,但不意味著會有顯著的提升
四種存在模式
    1. 查看靜態庫支持的架構
      打開終端 : lipo -info 靜態庫.a
    1. 靜態庫合并
      打開終端 : lipo -create 靜態庫1.a 靜態庫2.a -output 新靜態庫.a

關于bitcode

  • 什么是bitcode

    Bitcode. When you archive for submission to the App Store, Xcode will compile your app into an intermediate representation. The App Store will then compile the bitcode down into the 64 or 32 bit executables as necessary.
    當我們提交程序到App store上時,Xcode會將程序編譯為一個中間表現形式(bitcode)。然后App store會再將這個botcode編譯為可執行的64位或32位程序。

  • 哪些需要支持bitcode

    iOS,bitcode是可選的。
    watchOS,bitcode是必須的。
    Mac OS不支持bitcode。

  • 如何支持bitcode
    • 1,選擇靜態庫對應的target ->build settings ,搜索other c flags ,添加
      -fembed-bitcode
Paste_Image.png

這樣編譯出來的靜態庫就支持bitcode。

  • 如何檢驗是否已經支持bitcode

進入到.a所在的目錄,使用以下命令:
lipo -info xxxx.a
lipo -thin arm64 xxxx.a -output xxxx-arm64.a
ar -x xxxx-arm64.a,這三步完成后會在當前文件夾下生成對應的.o文件
otool -l xxxx.o | grep bitcode 最后通過這個,會輸出sectname __bitcode字樣,說明該靜態庫支持bitcode。


當你按以上方法可以寫出自己第一個靜態庫的時候,你就會發現一個缺點,調試很不方便,想著如果能看到源碼調試的話就好了,所以后邊我們講如何真正方便的調試靜態庫。

  • 1,新建single view application工程
  • 2,新建靜態庫target
新建靜態庫target
  • 3,引用靜態庫,不然會報錯
兩個地方引用靜態庫
引用靜態庫

有不對的請指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容