2011-12-04 11 views
12


Niektóre tła - I został zbudowany przy użyciu niestandardowego Framework przewodnik Diney pod adresem http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/ld: powielić symbol _objc_retainedObject na iOS 4.3, ale nie na iOS 5.0

wbudowanym zarówno armv6/ARMv7, jego o ARC- w oparciu o cel depolty 4,3.

Kiedy umieszczam wynikowy framework w projekcie 5.0, działa on świetnie, ale kiedy umieszczam go w projekcie 4.3 (ARC lub non-arc, nie ma znaczenia), otrzymuję następujące rzeczy, których naprawdę nie rozumiem. ..

Próbowałem również ręcznie dodać libarclite.a, ale nic to nie zmieniło.

ld: duplikat symbol _objc_retainedObject w /Users/freak4pc/Project/MyFramework.framework/MyFramework i /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o) dla architektury ARMv7 poleceń /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang nie powiodło się z kodem wyjścia 1

Czy wdzięczni za każdą pomoc w tej sprawie.
Dzięki
Shai

+0

Dlaczego nie po prostu zbudować statyczną bibliotekę tak, jak wszyscy inni na iOS? Podejście, z którym się łączysz, wydaje się być czymś w rodzaju hackowania, więc nie dziwię się, że może nie działać zgodnie z zamierzeniami. –

+0

Uhm właśnie dostałem sugestię, że biblioteki statyczne nie są tak elastyczne. Czy mógłbyś powiązać mnie z pewnymi zasobami na ten temat? –

+0

Nie jestem pewien, co oznaczałoby "mniej elastyczne" w tym przypadku. Jeśli masz kod swojej biblioteki, różnica między używaniem statycznej biblioteki a strukturą jest niewielka. Jeśli rozpowszechniasz prekompilowaną bibliotekę, wszystko, co musisz zrobić, to upewnić się, że nagłówki są również dostępne. Na przykład zobacz bibliotekę plot plot: http://code.google.com/p/core-plot/, która wykorzystuje framework dla Mac i bibliotekę statyczną dla iOS. Nie przypominam sobie, że trudno jest tam skompilować kompilację biblioteki statycznej. –

Odpowiedz

15

Mam problem z tym samym problemem. Rozwiązaniem jest ustawienie docelowego wdrożenia struktury na system iOS5 (sprawdź, czy nie powoduje to innych problemów).

Następnie musisz musi użyć użyć ARC w projekcie głównym, jeśli kierujesz do iOS4, w przeciwnym razie brak będzie libarclite. Moim rozwiązaniem będzie dostarczenie dwóch frameworków, w zależności od tego, czy używają ARC, czy nie.

Oto dwa linki do forum dev Apple z trochę więcej informacji: https://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

Aktualizacja: istnieje lepszy sposób. Po prostu zbuduj swoją bibliotekę statyczną z minimalnym celem iOS5 i ręcznie dodaj /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (i /Developer/usr/lib/arc/libarclite_iphonesimulator.a), jeśli Projekt jest nie przy użyciu ARC i wymaga obsługi iOS4.

Aktualizacja 2: W rzeczywistości wystarczy użyć flagi linkera - fobjc-arc; spowoduje to połączenie biblioteki libarclite z biblioteką, jeśli jeszcze jej tam nie ma. Najlepsze rozwiązanie.

+0

To nie jest zły pomysł, nie daj się zastrzelić! dzięki ! –

+0

Dziękuję, to lepszy sposób. ręcznie dodaj /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (i /Developer/usr/lib/arc/libarclite_iphonesimulator.a) – HelloWorld

2

Wow, to była trudna jazda, ale w końcu ją rozwiązałem!

To, co wywołało ostatni pomysł, to komentarz @ steipete, Jest to trochę skomplikowana sytuacja, więc postaram się wyjaśnić to każdemu, kto również mógł przekroczyć ten problem.

  1. Kompilowanie architektury ARC w systemie iOS 4.3 automatycznie dołącza plik libarclite.so do "mostu" 4.3 ARC z 5.0 ARC. Kiedy te ramy zostały zaimportowane do projektu 4.3, arclite było właściwie połączone dwukrotnie - raz dla frameworka (co jest 4.3), a raz dla samego projektu - co spowodowało błąd "duplikatu symbolu", co oznacza, że ​​framework musi być skompilowany na 5.0, a projekt może wynosić 4.3. Ale wtedy ;
  2. Moje środowisko korzysta z AFNetworking @mattt do wykonywania żądań HTTP i parsowania JSON różnych APIS.AFNetworking automatycznie sprawdza podczas kompilacji, jeśli twoim celem jest iOS5, a jeśli tak, to używa NSJSONSerialization, w przeciwnym razie powróciłby do każdej zaimportowanej biblioteki JSON, takiej jak JSONKit.
  3. Podczas kompilowania mojej frameworka AFNetworking dla iOS5 (aby uniknąć problemu nr 1), automatycznie dołącza się NSJSONSerialization, co spowoduje wyjątek w przypadku 4.3 projektów, co oznacza, że ​​będziesz musiał ręcznie szukać instrukcji kompilacji i usunąć przed kompilacją dzwoni do NSJSONSerialization, więc automatycznie powróci do biblioteki kompatybilnej z 4.3 (w moim przypadku JSONKit). Ten warunek kompilacji znajduje się w AFHTTPClient.m i AFJSONRequestOperation.m (np. #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6)
  4. Po usunięciu tych warunków z powodzeniem skompilowałem framework dla systemu iOS5 z JSONKit zamiast NSJSONSerialization iz powodzeniem mogłem go używać w moim iOS4.3 projekt.

Nadzieja to pomoże ktoś inny, kto może walczyć z tym przez kilka dni, tak jak ja :)

Shai.

+0

Szczerze mówiąc, nie widzę twojej odpowiedzi dodającej więcej wartości (# 2, # 3 i # 4 nie są nawet istotne dla pytania), więc pozostawia gorzki smak, który oznaczałeś jako "Twoja własna odpowiedź". Tęskniłeś także, aby wyjaśnić problematyczne, że twój projekt główny musi używać ARC, jeśli używasz ARC bez dodawania libarclite.so w podprojekcie, jeśli musi on obsługiwać iOS 4.x. – steipete

+0

Przykro mi, ale naprawdę nie zgadzam się z tobą. Nie mam problemu, aby oznaczyć twoją odpowiedź jako "właściwą" (nie dostaję punktów za zaznaczenie mojej własnej) - ale myślę, że moja odpowiedź jest bardziej kompletna, ponieważ wyjaśnia cały proces. 2-3-4 były powodem, dla którego nie mogłem skorzystać z twojej wskazówki, więc są BARDZO trafne. Ponadto wierzę w to, że moje pytanie brzmi tak, co jest istotne i co nie jest moim wyborem. Bardzo doceniam twoją pomoc, ale myślę, że twój komentarz tutaj był nie na miejscu. –

+1

Muszę zgodzić się z steipete. Twoja "odpowiedź" może być istotna dla twojego projektu, ale nie ma znaczenia dla problemów, które widzimy. – wuf810

Powiązane problemy