? ? ? ? 封裝代碼為動/靜態(tài)庫,編譯會產(chǎn)生兩個庫文件,一個真機(jī)運(yùn)行的,一個模擬器運(yùn)行的。兩者互不兼容,若真機(jī)運(yùn)行使用模擬器的庫或者模擬器運(yùn)行使用的真機(jī)的庫,都會報類似的錯:_OBJC_CLASS_$_某文件名", referenced from:,但如果每次在真機(jī)和模擬器運(yùn)行之間切換,總要先替換庫,就會很麻煩。所以下面將兩種庫的合并方法總結(jié)一下。
.a合并
? ? ? ? 將真機(jī)庫和模擬器庫放在同一個文件夾下,在這之前需要先將兩個庫重命名,否則會覆蓋。
? ? ? ? 打開終端,cd到該文件夾目錄下。通過下面的命令合并
? ? ? ? lipo[空格]-create[空格] [真機(jī)靜態(tài)庫文件名][空格][模擬器靜態(tài)庫文件名][空格]-output[空格] [合并后的文件名]

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

Architectures in the fat file: /Users/***/Desktop/XXX/libXXXX.a are: armv7 armv7s i386 x86_64
(其中armv7、armv7s為真機(jī)架構(gòu), i386、x86_64為模擬器架構(gòu))。
? ? ? ? 回車后,終端出現(xiàn)這個則表示合并成功。
.framework合并
? ? ? ? .framework合并方法和.a合并方法相同,只不過.framework合并的是.framework內(nèi)同名的那個文件。

? ? ? ? 先把兩個庫放在同一個文件夾下,放之前要先改成不同的名字。打開終端,cd到該文件夾目錄下(我放在了桌面上,所以cd到Desktop文件夾下)。同樣通過下面的命令合并
lipo[空格]-create[空格] [真機(jī)靜態(tài)庫文件名][空格] [模擬器靜態(tài)庫文件名][空格]-output[空格] [合并后的文件名]

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

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

? ? ? ? 該庫文件支持armv7 i386 x86_64 arm64,合成成功。
? ? ? ? 之后我們將合并得到的final文件改回原來的名字(例如我這里應(yīng)該改成IE),替換任一.framework下的IE文件, 該.framework就是我們最終需要的.framework文件了。
*注意:XCode12編譯的模擬器庫新增支持架構(gòu)arm64,由于真機(jī)庫也支持arm64,真機(jī)和模擬器庫無法再合并成一個。
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
*架構(gòu)的分離和移除移步:iOS 靜態(tài)庫/動態(tài)庫架構(gòu)分離和刪除
參考資料: