我在寫一個靜態庫,它對其他庫有依賴關係(在我的情況下是SBJSON和ASIHTTPRequest)。靜態庫依賴關係的最佳實踐
如果我將這些外部依賴關係編譯到我的庫中,那麼我無法鏈接到其他編譯了這些類的庫。我的目標是爲我的公司創建一組靜態庫,這些庫可以導入到任何新的應用程序,將這些依賴關係編譯到庫中顯然不是一種選擇。
有沒有人有任何建議/最佳做法來創建一套共同的依賴關係共享靜態庫?
我在寫一個靜態庫,它對其他庫有依賴關係(在我的情況下是SBJSON和ASIHTTPRequest)。靜態庫依賴關係的最佳實踐
如果我將這些外部依賴關係編譯到我的庫中,那麼我無法鏈接到其他編譯了這些類的庫。我的目標是爲我的公司創建一組靜態庫,這些庫可以導入到任何新的應用程序,將這些依賴關係編譯到庫中顯然不是一種選擇。
有沒有人有任何建議/最佳做法來創建一套共同的依賴關係共享靜態庫?
您可以使用依賴關係管理器,如CocoaPods或VendorKit來拉入所需的庫以及所有它的傳遞依賴項 - 庫依賴的庫。
依賴關係管理器的任務是管理傳遞依賴關係中的任何衝突 - 例如,如果兩個庫都使用不同版本的SBJSON,它將解決做什麼。你所要做的就是在配置文件中聲明你想要的頂層庫,並且它將確定需要哪些子庫並將它們拉入你的Xcode項目中。
CocaoPods通過將所有庫作爲源代碼進行管理,然後將它們全部編譯到單個靜態庫中 - 在一個單獨的項目中進行管理。然後通過工作區將其鏈接到您的項目中。
VendorKit採用類似的方法,但使用單個項目文件。
CocoaPods和VendorKit都允許您輕鬆地將您的庫發佈到中央存儲庫。如果您願意,CocaoPods允許您維護您自己的中央回購的私人或公共分支 - 即作爲企業存儲庫。
大多數時候這會讓你擺脫困境。在極少數情況下,您的庫可能依賴於另一個通用庫的特定舊版本。在這種情況下,您可以使用工具重命名該庫中的所有標題/ impl文件以避免衝突。
[編輯]:截至2013年1月,還有一個新的競爭者 - Maven Xcode插件。
Create a static framework對於每個庫。記錄頭文件中的依賴關係。
[編輯]:我現在更喜歡使用Cocoapods。請參見https://stackoverflow.com/a/10781087/9636
靜態庫只是對象文件的集合。在你的情況下,你不希望SBJSON和ASIHTTPRequest的對象文件被包含在你的靜態庫中 - 你想把這個工作留給最終的應用程序。你的靜態庫唯一需要的是SBJSON和ASIHTTPRequest的頭文件。
由於這些項目都是作爲源文件(.h和.m文件)分發的,您只需告訴Xcode不要爲您的靜態庫目標構建SBJSON/ASIHTTPRequest .m文件。
最簡單的方法是將這些項目的.h頭文件導入到Xcode項目中。或者,您可以導入.h和.m文件,但要確保。M檔不包括在「編譯源」建設階段的靜態庫的目標
其他一些相關的SO主題:
How can I avoid "duplicate symbol" errors in xcode with shared static libraries?
Duplicate symbol: Include static lib A in static lib B, also include lib A and B in XCode Project
但是如果我的靜態庫使用舊版本的sbjson - 3.0.4,並且新項目使用3.1?它有相同的m文件但不同的h文件,或者一個使用ARC,一個不使用? – 2012-07-24 14:59:05
這個非常簡單和合適的解決方案應該是被接受的答案。感謝Ben爲這個問題讓我更加頭疼! – thgc 2012-12-05 02:34:49
爲什麼不使用dinamyc庫,而不是? – LuisEspinoza 2012-03-14 14:00:59
好吧,這是不支持 – LuisEspinoza 2012-03-14 14:03:23