2012-03-14 90 views
30

我在寫一個靜態庫,它對其他庫有依賴關係(在我的情況下是SBJSON和ASIHTTPRequest)。靜態庫依賴關係的最佳實踐

如果我將這些外部依賴關係編譯到我的庫中,那麼我無法鏈接到其他編譯了這些類的庫。我的目標是爲我的公司創建一組靜態庫,這些庫可以導入到任何新的應用程序,將這些依賴關係編譯到庫中顯然不是一種選擇。

有沒有人有任何建議/最佳做法來創建一套共同的依賴關係共享靜態庫?

+0

爲什麼不使用dinamyc庫,而不是? – LuisEspinoza 2012-03-14 14:00:59

+0

好吧,這是不支持 – LuisEspinoza 2012-03-14 14:03:23

+3

(A)這對這個問題是相當無益的 - 我的問題是避免鏈接器重複符號。 SBJSON符號怎麼樣? (B)他們不會拋棄它。他們只是對此有意見。 (C)ASI是一個相當常用和真實世界測試過的庫 - 我的代碼幾乎肯定是更多的錯誤。即使從你鏈接到的問題接受的答案有錯誤! – deanWombourne 2012-03-15 11:15:46

回答

9

您可以使用依賴關係管理器,如CocoaPodsVendorKit來拉入所需的庫以及所有它的傳遞依賴項 - 庫依賴的庫。

依賴關係管理器的任務是管理傳遞依賴關係中的任何衝突 - 例如,如果兩個庫都使用不同版本的SBJSON,它將解決做什麼。你所要做的就是在配置文件中聲明你想要的頂層庫,並且它將確定需要哪些子庫並將它們拉入你的Xcode項目中。

CocaoPods通過將所有庫作爲源代碼進行管理,然後將它們全部編譯到單個靜態庫中 - 在一個單獨的項目中進行管理。然後通過工作區將其鏈接到您的項目中。

VendorKit採用類似的方法,但使用單個項目文件。

CocoaPods和VendorKit都允許您輕鬆地將您的庫發佈到中央存儲庫。如果您願意,CocaoPods允許您維護您自己的中央回購的私人或公共分支 - 即作爲企業存儲庫。

大多數時候這會讓你擺脫困境。在極少數情況下,您的庫可能依賴於另一個通用庫的特定舊版本。在這種情況下,您可以使用工具重命名該庫中的所有標題/ impl文件以避免衝突。

[編輯]:截至2013年1月,還有一個新的競爭者 - Maven Xcode插件。

13

靜態庫只是對象文件的集合。在你的情況下,你不希望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

+0

但是如果我的靜態庫使用舊版本的sbjson - 3.0.4,並且新項目使用3.1?它有相同的m文件但不同的h文件,或者一個使用ARC,一個不使用? – 2012-07-24 14:59:05

+0

這個非常簡單和合適的解決方案應該是被接受的答案。感謝Ben爲這個問題讓我更加頭疼! – thgc 2012-12-05 02:34:49