解決靜態(tài)庫沖突問題

最近在寫公司的智能家居項目時碰到靜態(tài)庫沖突問題,我和公司另外一個同事折騰了幾天終于弄出來了, 太坑人.......現(xiàn)在寫篇簡文記錄一下。

一,報錯現(xiàn)象

錯誤信息.png
11.png

二,問題分析

1- duplicate symbol,重復(fù)的標(biāo)識符

原因:我這里是兩個靜態(tài)庫中都有GCDAsyncUdpSocket.o,一個項目里面不能包含類名一樣的文件

2-命名沖突

原因一:在aes256.o和aes.o中都有名為 _aes_encrypt(加密)和_aes_decrypt(解密)的方法,這里方法名稱沖突了。
原因二:可能會從這個靜態(tài)庫調(diào)到那個靜態(tài)庫 然后報linker錯誤

三,解決方案

  1. 可以試著把other Link flag 改成 -force_load /Users/jss/Desktop/測試代碼/libKonkeSmartPlug.a 我這里用的絕對路徑做的測試 你們自己改成相對路徑就好了(這個意思是:各自的靜態(tài)庫加載各自的類不會出現(xiàn)從這個庫調(diào)用到那個類的庫)
運行再報錯的話 那就只能用終端命名把靜態(tài)庫中相同的第三方庫給刪掉 然后再合并生成新的靜態(tài)庫
  1. 看步驟(終端命令)
    注意: 做這個操作的時候,把靜態(tài)庫單獨拷貝到一個新的文件夾進(jìn)行測試
    1. cd /Users/jss/Desktop/測試靜態(tài)庫
    2. ls (查看目錄下的文件)
    3. lipo -info EasyConfig.a(例如armv7,armv7s,i386等)
    4. lipo EasyConfig.a -thin armv7 -output lbv7.a (分別把a(bǔ)rmv7,armv7s等等都寫一遍后面的.a 命名規(guī)范)
      5)再 ls 查看 (可以看到剛剛分出來的幾個.a)
    5. lipo -info lb* (注意命名 我這里.a都是lb開頭且都是四位)
    6. ar -d lb64.a GCDAsyncUdpSocket.o (armv7,armv7s等分別執(zhí)行一遍 目的是刪除)
  1. lipo -create lb64.a lb86.a lb38.a lb7s.a lbv7.a -output EasyConfig.a(重新合并 .a文件)
  2. cp EasyConfig.a /Users/jss/Desktop/測試代碼 (拷貝到項目中覆蓋源文件)
這里附上上面的終端操作的圖片:
終端命令.png

四,查看靜態(tài)庫包含哪些文件的命令如下:

  1. cd 文件路徑
  2. lipo -info EasyConfig.a
  3. mkdir armv7 (用來存放armv7平臺解壓后的.0文件: 目的也是為了看到某一個平臺里面所有的 .o 文件)
  4. lipo EasyConfig.a -thin armv7 -output lib.a (取出armv7 平臺的包)
  5. ar -t lib.a (查看庫中所包含的文件列表)
查詢靜態(tài)庫文件.png

五,總結(jié)

1.以后打包靜態(tài)庫的同志不要再坑隊友了,千萬別把第三方公用庫打在自己的包里
2.命名以后盡量規(guī)范,不然項目開發(fā)碰到的錯誤很難發(fā)現(xiàn)和解決
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容