最近在寫公司的智能家居項目時碰到靜態(tài)庫沖突問題,我和公司另外一個同事折騰了幾天終于弄出來了, 太坑人.......現(xiàn)在寫篇簡文記錄一下恤溶。
一乓诽,報錯現(xiàn)象
二,問題分析
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錯誤
三稠集,解決方案
- 可以試著把other Link flag 改成 -force_load /Users/jss/Desktop/測試代碼/libKonkeSmartPlug.a 我這里用的絕對路徑做的測試 你們自己改成相對路徑就好了(這個意思是:各自的靜態(tài)庫加載各自的類不會出現(xiàn)從這個庫調(diào)用到那個類的庫)
運(yùn)行再報錯的話 那就只能用終端命名把靜態(tài)庫中相同的第三方庫給刪掉 然后再合并生成新的靜態(tài)庫
- 看步驟(終端命令)
注意: 做這個操作的時候,把靜態(tài)庫單獨拷貝到一個新的文件夾進(jìn)行測試
- cd /Users/jss/Desktop/測試靜態(tài)庫
- ls (查看目錄下的文件)
- lipo -info EasyConfig.a(例如armv7,armv7s饥瓷,i386等)
- lipo EasyConfig.a -thin armv7 -output lbv7.a (分別把a(bǔ)rmv7,armv7s等等都寫一遍后面的.a 命名規(guī)范)
5)再 ls 查看 (可以看到剛剛分出來的幾個.a) - lipo -info lb* (注意命名 我這里.a都是lb開頭且都是四位)
- ar -d lb64.a GCDAsyncUdpSocket.o (armv7剥纷,armv7s等分別執(zhí)行一遍 目的是刪除)
- lipo -create lb64.a lb86.a lb38.a lb7s.a lbv7.a -output EasyConfig.a(重新合并 .a文件)
- cp EasyConfig.a /Users/jss/Desktop/測試代碼 (拷貝到項目中覆蓋源文件)
這里附上上面的終端操作的圖片:
四,查看靜態(tài)庫包含哪些文件的命令如下:
- cd 文件路徑
- lipo -info EasyConfig.a
- mkdir armv7 (用來存放armv7平臺解壓后的.0文件: 目的也是為了看到某一個平臺里面所有的 .o 文件)
- lipo EasyConfig.a -thin armv7 -output lib.a (取出armv7 平臺的包)
- ar -t lib.a (查看庫中所包含的文件列表)
五呢铆,總結(jié)
1.以后打包靜態(tài)庫的同志不要再坑隊友了,千萬別把第三方公用庫打在自己的包里