1. 程式人生 > >完美解決ios開發中兩個.framework檔案中.o檔案衝突的問題(linker command failed with exit code 1 (use -v to see invocation)

完美解決ios開發中兩個.framework檔案中.o檔案衝突的問題(linker command failed with exit code 1 (use -v to see invocation)

專案中使用到XYPrinter.framework和Printer.framework中的兩個.o檔案有衝突, 查了資料通過拆分XYPrinter.framework刪除其中衝突的.o檔案,然後重新生成靜態庫, 解決了問題.

步驟如下:

  1. 新建一個資料夾resolveConflict, 將XYPrinter.framework複製到resolveConflict資料夾內.XYPrinter.framework內容如圖, XYPrinter就是我們要拆分的檔案

  1. 開啟終端, cd到XYPrinter.framework下, 執行
$ lipo -info XYPrinter

終端會顯示該庫包含的cpu架構

Architectures in the fat file: XYPrinter are: armv7 i386 x86_64 arm64

這裡介紹一下各類裝置對應的cpu架構
模擬器包含的cpu架構:
iPhone 4s – iPhone 5 : i386
iPhone SE : x86_84
iPhone5s – iPhone 7 Plus : x86_64
真機裝置包含的cpu架構
iPhone 3g – iPhone 4s : armv7
iPhone 5 – iPhone 5c : armv7s
iPhone SE : arm64
iPhone 5s – iPhone 7 Plus : arm64
只要支援了armv7就不用再支援armv7s

3 . 執行如下命令, 從XYPrinter中拆分出arm64架構對應的.a庫並命名為XYPrinter_arm64.a

$ lipo XYPrinter -thin arm64 -output XYPrinter_arm64.a

然後同樣的方法修改架構名拆分出其他3種cpu架構對應的.a庫, 拆分完如下圖

$ lipo XYPrinter -thin armv7 -output XYPrinter_armv7.a
$ lipo XYPrinter -thin i386 -output XYPrinter_i386.a
$ lipo XYPrinter -thin x86_64 -output XYPrinter_x86_64.a

  1. 將各個.a庫拆分.o檔案.最好每個架構的.a庫都放到一個獨立的資料夾中拆分, 不然4個架構的.a庫拆分後所有的.o檔案混在一起就亂了

在XYPrinter.framework根目錄新建資料夾名為arm64, 將XYPrinter_arm64.a拖進該資料夾, 然後cd到arm64資料夾, 執行如下命令

$ ar -x XYPrinter_arm64.a

 

這樣XYPrinter_arm64.a就被拆分成很多的.o檔案. 在裡面找到造成衝突的.o檔案刪除掉. 從第一張圖的錯誤資訊可以看出是FscBleCentralModel.o檔案有衝突, 所以就把這個檔案刪了

第一張圖中的錯誤資訊裡顯示的只有arm64架構有衝突, 因為我是用真機測試的, 前面也介紹了各類裝置對應的cpu架構, 所以要在模擬器或是其他裝置上也能正常執行, 就需要把其他3個cpu架構的.a庫重複這一步進行拆分並刪除其中衝突的.o檔案

  1. 然後就是把拆分後的檔案重新生成.framework靜態庫. 在arm64資料夾裡執行如下命令
$ libtool -static -o ../XYPrinter_arm64.a *.o

生成了一個新的arm64架構的.a庫. 切換資料夾並重復該命令將被拆分的其他cpu架構的庫重新生成.

  1. 將所有cpu架構的.a庫進行合併. 需要先把XYPrinter檔案刪除掉, 因為合併之後的檔案最好跟之前名字一樣, 不影響正常使用. 刪掉XYPrinter之後cd到XYPrinter.framework下執行如下命令
$ lipo -create -output XYPrinter XYPrinter_arm64.a XYPrinter_armv7.a XYPrinter_i386.a XYPrinter_x86_64.a

這樣就把4個.a庫合併成了名為XYPrinter的檔案

  1. 最後恢復到第一步圖中的結構, 把多餘的檔案都刪掉就完成了 . 把新的XYPrinter.framework放到專案中, 再次執行就不會衝突了.