? ? ? ? 封裝代碼為動/靜態庫,編譯會產生兩個庫文件,一個真機運行的,一個模擬器運行的。兩者互不兼容,若真機運行使用模擬器的庫或者模擬器運行使用的真機的庫,都會報類似的錯:_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內同名的那個文件。
? ? ? ? 先把兩個庫放在同一個文件夾下,放之前要先改成不同的名字。打開終端,cd到該文件夾目錄下(我放在了桌面上,所以cd到Desktop文件夾下)。同樣通過下面的命令合并
lipo[空格]-create[空格] [真機靜態庫文件名][空格] [模擬器靜態庫文件名][空格]-output[空格] [合并后的文件名]
? ? ? ? 桌面上就會多出一個叫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 靜態庫/動態庫架構分離和刪除
參考資料: