iOS 動態庫和靜態庫(.a和.framework)真機庫和模擬器庫的合并

? ? ? ? 封裝代碼為動/靜態庫,編譯會產生兩個庫文件,一個真機運行的,一個模擬器運行的。兩者互不兼容,若真機運行使用模擬器的庫或者模擬器運行使用的真機的庫,都會報類似的錯:_OBJC_CLASS_$_某文件名", referenced from:,但如果每次在真機和模擬器運行之間切換,總要先替換庫,就會很麻煩。所以下面將兩種庫的合并方法總結一下。

.a合并

? ? ? ? 將真機庫和模擬器庫放在同一個文件夾下,在這之前需要先將兩個庫重命名,否則會覆蓋。

? ? ? ? 打開終端,cd到該文件夾目錄下。通過下面的命令合并

? ? ? ? lipo[空格]-create[空格] [真機靜態庫文件名][空格][模擬器靜態庫文件名][空格]-output[空格] [合并后的文件名]

終端命令示意圖

? ? ? ? 合并后使用 lipo -info 命令檢查庫文件是否合并成功

檢查命令:

檢查命令示意圖

Architectures in the fat file: /Users/***/Desktop/XXX/libXXXX.a are: armv7 armv7s i386 x86_64

(其中armv7、armv7s為真機架構, i386、x86_64為模擬器架構)。

? ? ? ? 回車后,終端出現這個則表示合并成功。


.framework合并

? ? ? ? .framework合并方法和.a合并方法相同,只不過.framework合并的是.framework內同名的那個文件。

需要合成的是.framework內同名的那個文件

? ? ? ? 先把兩個庫放在同一個文件夾下,放之前要先改成不同的名字。打開終端,cd到該文件夾目錄下(我放在了桌面上,所以cd到Desktop文件夾下)。同樣通過下面的命令合并

lipo[空格]-create[空格] [真機靜態庫文件名][空格] [模擬器靜態庫文件名][空格]-output[空格] [合并后的文件名]

合并命令示意圖

? ? ? ? 桌面上就會多出一個叫final的庫

生成的合并后的final庫

? ? ? ? 我們使用lipo -info 檢查一下是否同時支持模擬器和真機,輸入lipo -info 把庫文件直接拖入終端,回車

檢查是否合成成功的命令

? ? ? ? 該庫文件支持armv7 i386 x86_64 arm64,合成成功。

? ? ? ? 之后我們將合并得到的final文件改回原來的名字(例如我這里應該改成IE),替換任一.framework下的IE文件, 該.framework就是我們最終需要的.framework文件了。


*注意:XCode12編譯的模擬器庫新增支持架構arm64,由于真機庫也支持arm64,真機和模擬器庫無法再合并成一個。

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/XY/Desktop/Release-iphoneos/libImageEditor.a and /Users/XY/Desktop/Release-iphonesimulator/libImageEditor.a have the same architectures (arm64) and can't be in the same fat output file


*架構的分離和移除移步:iOS 靜態庫/動態庫架構分離和刪除



參考資料:

徹底解決_OBJC_CLASS_$_某文件名", referenced from:問題

合并第三方真機和模擬器的.framework或(靜態庫.a)文件的方法

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

推薦閱讀更多精彩內容