IOS合并lib(.a)庫的終極可用方法

(可用于解決duplicate symbol靜態(tài)庫沖突)

網(wǎng)上流傳了太多關(guān)于合并lib庫的方法,自己也嘗試過,但大多失敗。有感于這種急于解決問題,經(jīng)過百般嘗試后依舊無果的無奈心情,小翁在這里用一個(gè)實(shí)例來完整闡述如何在mac中合并lib靜態(tài)庫。

這里以移動(dòng)廣告平臺(tái)多盟的三個(gè)lib庫為例子,之所以以此為例子,是因?yàn)槲乙灿龅搅藥鞗_突的問題,所以才有了本文的內(nèi)容。

本文的目標(biāo):合并libDomobOfferWallSDK.a、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a

Let`s begin!

1.依次查看所有需要合并的lib庫所支持的框架類型。i386表示支持iphone模擬器,armv6應(yīng)用在iphone 3gs上,armv7應(yīng)用在iphone4,armv7s應(yīng)用在iphone4s以及iphone5,arm64應(yīng)用在最新的iphone5s上。

lipo -info libDomobOfferWallSDK.a輸出是:Architectures in the fat file: libDomobOfferWallSDK.a are: armv7 armv7s i386

其他同理

看到紅色粗體的fat了嗎,fat file表示這個(gè)庫里面合并了多于1個(gè)框架。

2.將lib庫拆分出armv7、armv7s、i386類型的.a:

lipo -extract_family armv7 -output libDomobOfferWallSDK_arm.a libDomobOfferWallSDK.a

很多人會(huì)以為上面這條命令就可以一步到位分離出armv7版本,因?yàn)槟泔@式地指出armv7了。但是,你錯(cuò)了。libDomobOfferWallSDK_arm.a仍舊是fat file,也就是里面含有了arm所有版本,這也是網(wǎng)上很多版本的教程錯(cuò)誤的原因。如果誤以為libDomobOfferWallSDK_arm.a只含armv7一個(gè)版本,則下一步的解.o操作就會(huì)失敗,會(huì)提示"is a fat file"。小翁認(rèn)為,最保險(xiǎn)的做法是每次lib變化時(shí)都用lipo -info查看一下。現(xiàn)在我們查看一下libDomobOfferWallSDK_arm.a庫:

lipo -info libDomobOfferWallSDK_arm.a

打印出:Architectures in the fat file: libDomobOfferWallSDK_arm.a are: armv7 armv7s

接著用如下命令進(jìn)一步分離出單獨(dú)的armv7、armv7s版本:(非常重要的步驟)

lipo libDomobOfferWallSDK_arm.a -thin armv7 -output libDomobOfferWallSDK_armv7_final.a

lipo libDomobOfferWallSDK_arm.a -thin armv7s -output libDomobOfferWallSDK_armv7s_final.a

而對(duì)于i386則不用上述那么麻煩,直接用第一句-extract_family指令就能分離出只含i386版本的庫:

1lipo -extract_family i386 -output libDomobOfferWallSDK_i386.a libDomobOfferWallSDK.a?

經(jīng)過上面操作后,我們得到了第一個(gè)待合并庫libDomobOfferWallSDK.a 的armv7、armv7s、i386三個(gè)版本的庫。剩下的兩個(gè)待合并庫同理。

3.分離出目標(biāo)文件(.o)

進(jìn)行實(shí)質(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的同級(jí)目錄下新建一個(gè)文件夾,專門用來接收解壓出來的.o文件。同種版本(如armv7)的都解壓到這個(gè)文件夾中,相同的.o文件他會(huì)自己覆蓋掉。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容