iOS中靜態庫的使用

來源:互聯網
上載者:User

iOS中靜態庫的使用
iOS中庫的相關概念庫: 就是一段編譯好的二進位代碼,加上標頭檔就可以供別人使用了

庫的分類:開源庫和閉源庫的形式

開源庫如:AFNetworking, 源碼一般放在某個版本控制庫中
很多人直接下載開原始碼,將相關檔案copy到自己的工程,直接使用,缺點是當開源庫的版本更新後,還要在手動copy一次,比較麻煩 使用git的submodule 現在比較常用的是cocoapods,用命令匯入開源庫,而且不用關心開源庫的相關依賴。cocoapods的本質是將公用庫編譯成靜態庫,然後使得主工程依賴此靜態庫 閉源庫 用途: 某些代碼需要給別人使用,但是又不希望給被人看到源碼,就需要以庫的形式進行封裝,只暴露出標頭檔 對某些不會進行大的改動的代碼,我們想要減少編譯的時間,就可以打包成庫,因為庫是已經編譯好的二進位檔案了,編譯的時候Link一下就可以了,不會浪費編譯時間。

根據使用庫Link的方式,閉源庫可以分為靜態庫和動態庫

靜態庫:(.a或者.framework )在編譯的時候會被直接copy一份,複製到目標程式裡,在編譯完成之後,庫檔案實際就沒有多大作用了,目標程式沒有外部依賴,可以直接運行,缺點是(目標程式的體積會增大) .a格式的靜態庫,一般使用的時候需要提供.h .a .bundle檔案,由於建立靜態庫項目的時候編譯出來的靜態庫只支援特定的一種硬體架構體系,所以如果需要產生通用靜態庫,需要用到lipo命令將多個靜態庫合并。 .framework格式的靜態庫,framework最終只是一個bundle(一個檔案夾,裡面按照規定的目錄結構方式檔案),但是對XCode而言這樣的target還是有真假(Real/Fake)之分,只有真的情況下XCode主工程在添加依賴的時候才能夠選擇此公用庫項目的framework漲的target 動態庫:在編譯時間不會被copy盜目標程式,目標程式只會儲存指向動態庫的引用,等到程式運行時,動態庫才會被真正載入進來。不會影響目標程式的體積,但是會帶來一部分效能損失。蘋果不允許自製動態庫上架到appstoreiOS中.a靜態庫的製作建立XCode中的lib工程如所示:
vcbky/u5pLPMPGJyIC8+DQo8aW1nIGFsdD0="UseLib" src="http://www.bkjia.com/uploads/allimg/160409/0423033F1-1.gif" title="\" />

註:引用靜態庫的工程的Target Dependencies和Link Binary With Libraries均需要添加.a靜態庫

引用靜態庫的工程,需要在Header Search Paths中添加靜態庫項目的標頭檔的路徑(“..”表示返回上層目錄)

製作的靜態庫中如果添加了分類,引用靜態庫的工程需要在Other linker Flags中添加-ObjC

編譯靜態庫
編譯靜態庫項目中的所有檔案:
編譯靜態庫項目中的部分檔案:

註:當只需要打包部分檔案時,只需要在打包靜態庫的工程裡面不需要打包的.m檔案的Taget MemberShip中的勾選去掉,則該檔案將不會被打包到靜態庫中去


查看自己打包的靜態庫都包含了哪些檔案可以用lipo命令

lipo 命令的用法

查看靜態庫中包含哪些架構

lipo -info lib.a   

合并模擬器庫檔案和真機庫檔案

 lipo -create -output lib.a lib-armv6.a lib-i386.a  

解壓出指定架構的靜態庫

lipo -extract_family armv7 -output lib-armv7.a lib.a或者lipo lib.a -thin armv7 -output lib-armv7.a

將a格式的靜態庫解壓為o檔案,可以解壓出所有的.o檔案

ar -x lib.a

將o檔案合并為a檔案

libtool -static -o lib.a *.o
靜態庫中的注意事項靜態庫所依賴的dylib或者framework,最終使用靜態庫的程式也需要引用 靜態庫是二進位代碼,區分處理器類型的,可以使用lipo -create –output建立支援多處理器的靜態庫 靜態庫中使用的開原始碼與引用靜態庫的工程使用的開原始碼相同時,將會出現衝突.
解決1: 靜態庫不打包相關的開原始碼,在靜態庫使用說明文檔中列出所依賴的開源庫及其版本 解決2: 靜態庫在打包開原始碼時,修改開原始碼的類的命名加上三個字母以上的首碼(不建議) 對於已經打包好的靜態庫,可以利用lipo命令解包其中一個靜態庫,然後把發生衝突的.o檔案刪除,然後lipo命令重新打包,然後對每種處理器架構的.a檔案重複操作,最後lipo重新合并靜態庫,替換原來的靜態庫 a.靜態庫中的類的命名與引用靜態庫的工程的類的命名相同時將會被視為重複定義(OC沒有命名空間導致)
解決:靜態庫中的類命名加上三個字母以上的首碼 靜態庫中使用Category,用Category添加的方法即使名字重複 了也不會報錯,但是會存在其中一個方法覆蓋了另一個
解決: 建議給category添加的方法添加首碼 全域變數重名是必然編譯失敗的
解決:給靜態庫中用到的全域變數加首碼 靜態庫中有可能會使用debug時開啟log,release關閉log,發布到Appstore的應用不應該把調試的log列印出來,因此,在打包靜態庫時,把Build Configuration選擇為Release一般可以把多數開源庫的log都去掉了,如果靜態庫使用者希望能在開發時看到log,這時就看不到了
解決:分開打debug和release的包 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.