iOS-靜態庫聯調中的若干問題

Doliant發表於2019-05-02

毫無意義的封面圖

一.概述

日常開發中,靜態庫的開發總是要花費開發者很大的精力。工作中我們一般都是在專案中進行程式碼編寫,在需要的時候把程式碼提出來另行打包,若有需求修改或者除錯時,總需要把程式碼或者庫拿回原程式中進行測試修改。 由於工作需要我要經常修改靜態庫程式碼中的內容,恰好最近在靜態庫聯調的時候出現了一些問題,記錄下來以後避免踩到這些坑。

二、操作步驟

1.建立工程

用Xcode建立一個project,在project-TARGETS中建立一個.a靜態庫檔案:

在project中建立靜態庫檔案
建立好的靜態庫檔案會出現在這裡
靜態庫建立完成

2.在主專案中進行相關配置

主專案配置

3.在靜態庫檔案中配置需要暴露出的標頭檔案

新增暴露的標頭檔案

以上步驟操作是不是都很順利,讓人頗有一種歲月靜好的既視感,然而問題來了。在我描述問題之前,先說明一下我project的配置。 在我的專案中除了自己需要打包釋出的靜態庫檔案以外,還需要引入很多第三方的SDK:支付寶微信銀聯銀聯ApplePayQQ錢包百度錢包用於業務除錯。

問題一:

在我需要打包的靜態庫檔案中,需要用到反射NSClassFromString來建立上文提到的SDK中的類以及類物件,然而我嘗試了多次未能建立成功。 關於這個問題,在stackoverflow搜尋到了相關內容

stackoverflow.com/questions/2…

上面提供了一個解決方法:當你需要例項化靜態庫中的類以及物件時,需要在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…

相關文章