一.概述
日常開發中,靜態庫的開發總是要花費開發者很大的精力。工作中我們一般都是在項目中進行代碼編寫,在需要的時候把代碼提出來另行打包,若有需求修改或者調試時,總需要把代碼或者庫拿回原程序中進行測試修改。
由于工作需要我要經常修改靜態庫代碼中的內容,恰好最近在靜態庫聯調的時候出現了一些問題,記錄下來以后避免踩到這些坑。
二、操作步驟
1.創建工程
用Xcode創建一個project,在project
-TARGETS
中創建一個.a靜態庫文件:
創建好的靜態庫文件會出現在這里
2.在主項目中進行相關配置
3.在靜態庫文件中配置需要暴露出的頭文件
以上步驟操作是不是都很順利,讓人頗有一種歲月靜好的既視感,然而問題來了。在我描述問題之前,先說明一下我project的配置。
在我的項目中除了自己需要打包發布的靜態庫文件以外,還需要引入很多第三方的SDK:支付寶
、微信
、銀聯
、銀聯ApplePay
、QQ錢包
、百度錢包
用于業務調試。
問題一:
在我需要打包的靜態庫文件中,需要用到反射NSClassFromString
來創建上文提到的SDK中的類以及類對象,然而我嘗試了多次未能創建成功。
關于這個問題,在stackoverflow搜索到了相關內容
http://stackoverflow.com/questions/2227085/nsclassfromstring-returns-nil
上面提供了一個解決方法:當你需要實例化靜態庫中的類以及對象時,需要在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.
--https://developer.apple.com/library/mac/qa/qa1490/_index.html
大概意思是設置了這個參數會讓鏈接器加載所有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
鏈接上你自己的靜態庫文件了。
平時開發的時候一般也不會特別的去關注設置某個參數的意義,只知道需要設置這個參數。而這次踩了坑才回頭研究了一下某些參數的意義,果然還是要多掉坑成長才快吶~~~
參考文檔
http://stackoverflow.com/questions/2227085/nsclassfromstring-returns-nil
http://stackoverflow.com/questions/24298144/duplicate-symbols-for-architecture-x86-64
https://developer.apple.com/library/mac/qa/qa1490/_index.html
http://blog.csdn.net/yanglei3kyou/article/details/52020967