Swift工程如何集成Static Library

咱們的iOS項目中使用了Swift+Objective-C的混合開發,很長一段時間咱們在Podfile中使用的是use_frameworks!,也就是把全部Pods作成Dynamic framework。 微信等第三方SDK以靜態庫.a的形式提供給開發者,致使咱們沒有辦法直接依賴,會報相似xxx has transitive dependencies that include static binaries的錯誤,所以咱們不得不把.a封裝成動態framework而後才能經過Cocoapods集成到項目裏。php

基本概念

  • 靜態庫:一堆目標文件的打包體。連接時會被完整的複製到可執行文件中,存在多個可執行文件中包含同一份靜態庫代碼的問題。
  • 動態庫:一個沒有main函數的可執行文件。連接時不復制代碼,程序啓動後用dyld加載,而後再決議符號。因此一份動態庫能夠供多個程序動態連接,達到節省內存的目的。

坑一

Dynamic framework的製做過程網上有不少文章,我主要參考了組件化-動態庫實戰 這邊文章。再次感謝文章做者@南梔傾寒 按這篇文章一步一步來基本能夠完成90%以上的工做。之因此不是100%是由於咱們實際製做中遇到了CPU指令集的支持問題,須要特別關注如下幾點:bash

  • Mach-O Type要選擇Dynamic Library
  • Buld Setting中Other Linker Flags要加上-all_load,不然可能會致使部分文件沒法集成到framework
  • Buld Setting中Build Active Architecture Only選No
  • 指令集合並,做者在文中附帶了script,可使生成的framework同事支持模擬器和真機的CPU上容許,很贊! framwork作好後可使用lipo -info 查看所支持的CPU架構,顯示出Architectures in the fat file: XXX are: i386 x86_64 armv7 arm64表示同時支持了模擬器和真機,能夠拿來用了。

坑二

Dynamic framework打好了,經過Cocoapods集成到主工程。調試、運行一切OK。最終要打包上線時,果真掛了!!!error提示微信

bitcode bundle could not be generated because
 xxx was built without full bitcode.
All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture armv7 

複製代碼

因而又是一番Google。最終在這篇文章找到了解決方案,淚牛滿面。同時腦補了下-fembed-bitcode-marker和-fembed-bitcode,仍是以爲收穫滿滿。因而在製做Dy namic framework的工種的Bulid Settings中同時作了如下處理架構

  • Enable Bitcode = Yes
  • Other C Flags中添加-fembed-bitcode
  • User-Defined中添加BITCODE_GENERATION_MODE=bitcode

而後再次構建出新的framework集成到主工程中去Archive,這下,終於,穩了!函數

相關文章
相關標籤/搜索