一.概述
日常開發中,靜態庫的開發總是要花費開發者很大的精力。工作中我們一般都是在專案中進行程式碼編寫,在需要的時候把程式碼提出來另行打包,若有需求修改或者除錯時,總需要把程式碼或者庫拿回原程式中進行測試修改。 由於工作需要我要經常修改靜態庫程式碼中的內容,恰好最近在靜態庫聯調的時候出現了一些問題,記錄下來以後避免踩到這些坑。
二、操作步驟
1.建立工程
用Xcode建立一個project,在project
-TARGETS
中建立一個.a靜態庫檔案:
2.在主專案中進行相關配置
3.在靜態庫檔案中配置需要暴露出的標頭檔案
以上步驟操作是不是都很順利,讓人頗有一種歲月靜好的既視感,然而問題來了。在我描述問題之前,先說明一下我project的配置。
在我的專案中除了自己需要打包釋出的靜態庫檔案以外,還需要引入很多第三方的SDK:支付寶
、微信
、銀聯
、銀聯ApplePay
、QQ錢包
、百度錢包
用於業務除錯。
問題一:
在我需要打包的靜態庫檔案中,需要用到反射NSClassFromString
來建立上文提到的SDK中的類以及類物件,然而我嘗試了多次未能建立成功。
關於這個問題,在stackoverflow搜尋到了相關內容
上面提供了一個解決方法:當你需要例項化靜態庫中的類以及物件時,需要在Build settings
-Linking
-Other Linking Flags
新增-ObjC
注:設定-ObjC
引數時請一定確認是在主專案上新增的,不要新增到自己建立的靜態庫專案中去了。
既然已經有解決辦法了那就按照方法的指導去做吧,但問題並不是這麼容易就能解決的。
問題二:
按照上述的解決辦法設定完成,command
+B
一編譯結果一片飄紅:
-ObjC
引數的配置。
於是我詳細查了一下這個引數的意義
This flag causes the linker to load every object file in the library that defines an Objective-C class or category. While this option will typically result in a larger executable (due to additional object code loaded into the application), it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes. --developer.apple.com/library/mac…
大概意思是設定了這個引數會讓連結器載入所有Objective-C類和類別,同時也可以載入包含類別的Objective-C的靜態庫。
這篇文件的最後一句話給了我啟示,在沒設定這個引數之前是不會連結靜態庫檔案進行編譯的,設定完這個引數之後出現了引入同名檔案的錯誤,只有可能是連結上了一個靜態庫檔案而裡面的內容跟我project的程式碼檔案重複了,順著這個思路我聯想到了在2.在主專案中進行相關配置
進行的第4步:
-ObjC
,連結上了這個靜態庫檔案跟我專案中的程式碼檔案衝突了。定位了問題發生點之後,剩下的就是行動了。果然,刪除了這個位置的靜態庫檔案就沒有再報錯了,專案就可以正常執行了。
總結
踩過這次的坑,做一點總結吧。若你的project不需要引入第三方靜態庫的時候,可以在主專案中Build Phases
- Link Binary With Libraries
連結上你自己的靜態庫檔案;若你的project中需要引入第三方靜態庫,需要在主專案中的Build settings
-Linking
-Other Linking Flags
新增-ObjC
引數,就別在Build Phases
- Link Binary With Libraries
連結上你自己的靜態庫檔案了。
平時開發的時候一般也不會特別的去關注設定某個引數的意義,只知道需要設定這個引數。而這次踩了坑才回頭研究了一下某些引數的意義,果然還是要多掉坑成長才快吶~~~
參考文件
stackoverflow.com/questions/2… stackoverflow.com/questions/2… developer.apple.com/library/mac… blog.csdn.net/yanglei3kyo…