2012-03-14 19 views
30

Piszę bibliotekę statyczną, która ma zależności od innych bibliotek (w moim przypadku SBJSON i ASIHTTPRequest).Najlepsza praktyka w przypadku zależności bibliotek statycznych

Jeśli skompiluję te zewnętrzne zależności do mojej biblioteki, to nie będę mógł połączyć się z innymi bibliotekami, do których zostały wkompilowane te klasy. Moim celem jest stworzenie zestawu statycznych bibliotek dla mojej firmy, które można zaimportować do dowolnego nowego aplikacja, kompilowanie tych zależności w bibliotece nie jest oczywiście opcją.

Czy ktoś ma jakieś porady/najlepsze praktyki dotyczące tworzenia zestawu wspólnych bibliotek statycznych ze wspólnymi zależnościami?

+0

Dlaczego nie używać dinamyc bibliotekę zamiast? – LuisEspinoza

+0

ok, to nie jest obsługiwane – LuisEspinoza

+3

(A) To nie jest pomocne dla tego pytania - mój problem polega na unikaniu duplikowania symboli łącznika. A co z symbolami SBJSON? (B) Oni tego nie robią. Po prostu mają o tym opinię. (C) ASI to dość powszechnie używana i sprawdzona w świecie rzeczywistym biblioteka - mój kod jest prawie na pewno bardziej błędny. Nawet zaakceptowana odpowiedź na pytanie, z którym się łączysz, zawiera błędy! – deanWombourne

Odpowiedz

9

Można użyć menedżera zależnościach jak CocoaPods lub VendorKit wyciągnąć w wymaganej biblioteki, a także wszystko to przechodnie zależnościami - Biblioteki, że biblioteka zależy.

Zadaniem menedżera zależności jest zarządzanie konfliktami w przejściowych zależnościach - np. Jeśli dwie biblioteki używają różnych wersji SBJSON, to rozwiąże to, co należy zrobić. Wszystko, co musisz zrobić, to zadeklarować bibliotekę najwyższego poziomu, którą chcesz w pliku konfiguracyjnym, a ona pokaże, jakie pod-biblioteki są potrzebne i przenieść je do twojego projektu Xcode.

CocaoPods radzi sobie z tym dobrze, pobierając wszystkie biblioteki jako źródło, a następnie kompilując je wszystkie w jedną bibliotekę statyczną - w osobnym projekcie. Jest on następnie łączony z projektem za pośrednictwem obszaru roboczego.

VendorKit stosuje podobne podejście, ale używa pojedynczego pliku projektu.

Zarówno CocoaPods, jak i VendorKit umożliwiają łatwe publikowanie biblioteki w centralnym repozytorium. CocaoPods pozwala na zachowanie własnego prywatnego lub publicznego rozwidlenia centralnego repo, jeśli chcesz - np. Jako repozytorium dla przedsiębiorstw.

W większości przypadków spowoduje to problemy. W rzadkich przypadkach twoja biblioteka może zależeć od bardzo specyficznej, starszej wersji innej wspólnej biblioteki. W takim przypadku można użyć narzędzia do zmiany nazwy wszystkich plików nagłówkowych/impl w tej bibliotece, aby uniknąć kolizji.

[Edytuj]: Od stycznia 2013 r. Jest również nowy kandydat - wtyczka Maven Xcode.

13

Biblioteka statyczna to tylko zbiór plików obiektowych. W twoim przypadku nie chcesz, aby pliki obiektów dla SBJSON i ASIHTTPRequest były dołączone do twojej biblioteki statycznej - chcesz pozostawić to zadanie dla ostatecznej aplikacji. Jedyne czego potrzebuje statyczna biblioteka to pliki nagłówkowe dla SBJSON i ASIHTTPRequest.

Ponieważ te projekty są dystrybuowane jako pliki źródłowe (pliki .h i .m), wystarczy powiedzieć programowi Xcode, aby nie budował plików SBJSON/ASIHTTPRequest .m dla docelowej biblioteki statycznej.

Najprostszym sposobem na to jest zaimportowanie plików nagłówkowych .h dla tych projektów do projektu Xcode. Możesz także zaimportować zarówno pliki .h, jak i .m, ale upewnij się, że.Pliki m nie są zawarte w „skompilować źródła” zbudować fazie statycznej docelowej biblioteki

Niektóre inne istotne SO tematy:

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

Ale co, jeśli moja statyczna lib używa starszej wersji sbjson - 3.0.4, a nowy projekt używa wersji 3.1? ma te same pliki m, ale inne pliki h lub jeden używa ARC, a drugi nie? –

+0

To bardzo proste i trafne rozwiązanie powinno być zaakceptowaną odpowiedzią. Dzięki Ben za oszczędzanie mi więcej bólów głowy w tym wydaniu! – thgc

Powiązane problemy