(可用于解決duplicate symbol靜態(tài)庫沖突)
網(wǎng)上流傳了太多關(guān)于合并lib庫的方法狡蝶,自己也嘗試過猾编,但大多失敗。有感于這種急于解決問題,經(jīng)過百般嘗試后依舊無果的無奈心情报账,小翁在這里用一個實例來完整闡述如何在mac中合并lib靜態(tài)庫。
這里以移動廣告平臺多盟的三個lib庫為例子埠偿,之所以以此為例子透罢,是因為我也遇到了庫沖突的問題,所以才有了本文的內(nèi)容冠蒋。
本文的目標:合并libDomobOfferWallSDK.a羽圃、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a
Let`s begin!
1.依次查看所有需要合并的lib庫所支持的框架類型抖剿。i386表示支持iphone模擬器朽寞,armv6應用在iphone 3gs上,armv7應用在iphone4斩郎,armv7s應用在iphone4s以及iphone5脑融,arm64應用在最新的iphone5s上。
lipo -info libDomobOfferWallSDK.a輸出是:Architectures in the fat file: libDomobOfferWallSDK.a are: armv7 armv7s i386
其他同理
看到紅色粗體的fat了嗎缩宜,fat file表示這個庫里面合并了多于1個框架肘迎。
2.將lib庫拆分出armv7甥温、armv7s、i386類型的.a:
lipo -extract_family armv7 -output libDomobOfferWallSDK_arm.a libDomobOfferWallSDK.a
很多人會以為上面這條命令就可以一步到位分離出armv7版本妓布,因為你顯式地指出armv7了姻蚓。但是,你錯了匣沼。libDomobOfferWallSDK_arm.a仍舊是fat file狰挡,也就是里面含有了arm所有版本,這也是網(wǎng)上很多版本的教程錯誤的原因肛著。如果誤以為libDomobOfferWallSDK_arm.a只含armv7一個版本圆兵,則下一步的解.o操作就會失敗,會提示"is a fat file"枢贿。小翁認為殉农,最保險的做法是每次lib變化時都用lipo -info查看一下。現(xiàn)在我們查看一下libDomobOfferWallSDK_arm.a庫:
lipo -info libDomobOfferWallSDK_arm.a
打印出:Architectures in the fat file: libDomobOfferWallSDK_arm.a are: armv7 armv7s
接著用如下命令進一步分離出單獨的armv7局荚、armv7s版本:(非常重要的步驟)
lipo libDomobOfferWallSDK_arm.a -thin armv7 -output libDomobOfferWallSDK_armv7_final.a
lipo libDomobOfferWallSDK_arm.a -thin armv7s -output libDomobOfferWallSDK_armv7s_final.a
而對于i386則不用上述那么麻煩超凳,直接用第一句-extract_family指令就能分離出只含i386版本的庫:
1lipo -extract_family i386 -output libDomobOfferWallSDK_i386.a libDomobOfferWallSDK.a?
經(jīng)過上面操作后,我們得到了第一個待合并庫libDomobOfferWallSDK.a 的armv7耀态、armv7s轮傍、i386三個版本的庫。剩下的兩個待合并庫同理首装。
3.分離出目標文件(.o)
進行實質(zhì)上的合并创夜。xcode里提示duplicate symbol都是說***.o與***.o沖突。注意仙逻,只有非fat file驰吓,也就是只含有單種版本的lib庫才能分離出.o文件
1、 ar -x ../libDomobOfferWallSDK_armv7_final.a
2系奉、 ar -x ../libDomobAdWallCoreSDK+UI_armv7_final.a
3檬贰、 ar -x ../libDomobAdSDK_armv7_final.a
這一步最好是在lib*_final.a的同級目錄下新建一個文件夾,專門用來接收解壓出來的.o文件缺亮。同種版本(如armv7)的都解壓到這個文件夾中翁涤,相同的.o文件他會自己覆蓋掉。
4.從.o文件中合并成靜態(tài)庫:
1libtool -static?-o ../libDomobUniversal-armv7.a *.o
armv7s萌踱、i386版本同理葵礼。
5.合并成最終的通用靜態(tài)庫:
1lipo -create -output libDomobUniversal.a libDomobUniversal-i386.a libDomobUniversal-armv7.a libDomobUniversal-armv7s.a