2012-01-06 7 views
24

Mam projekt inny niż ARC, który korzysta z biblioteki statycznej z obsługą ARC. Jest to obsługiwany scenariusz, więc wszystko działa poprawnie. To znaczy, dopóki nie uruchomię kodu na urządzeniu 4.x, w tym na symulatorze. W tym przypadku kod wysadza z następującym błędem łącznikowej:Biblioteka statyczna z obsługą ARC powiązana z projektem innym niż ARC powodującym błędy linkera

dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong 
    Referenced from: /Users/zoul/Library/Application Support/iPhone Simulator/4.3.2/Applications/…/Demo.app/Demo 
    Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation 

Dzieje się tak szybko, jak niektórzy z kodem ARC-włączona próbuje zadzwonić _objc_storeStrong funkcję, jak w init metody (self = [super init]). Przekształcenie głównego projektu w ARC rozwiązuje problem, ale chciałbym się dowiedzieć, czy istnieją inne rozwiązania.

+0

Czy łączysz za pomocą LLVM, który obsługuje ARC? – Krizz

+0

wpierw: toolchain prawdopodobnie dodał bibliotekę do połączenia, gdy ARC jest włączone przez główny projekt. jeśli nie możesz zlokalizować tego w transkrypcjach, możesz być w stanie połączyć się z nim, kompilując jedno źródło z ARC. – justin

+1

To świetny pomysł, @Justin! Sztuczka z pojedynczym plikiem obsługującym ARC nie działała, ale udało mi się znaleźć odpowiedni argument dla linkera, aby dołączyć bibliotekę i wygląda na to, że działa. Czy możesz to zrobić jako odpowiedź? Zrobimy to, zrobię, edytuję, żeby dodać szczegóły. – zoul

Odpowiedz

30

Założono, że pakiet narzędzi mógł dodać niezbędne biblioteki do połączenia, aby ARC działał poprawnie. Zatem transkrypcja linkera może zawierać tę informację. Jeśli projekt samej aplikacji nie ma włączonej obsługi ARC, możesz nie uzyskać tych ustawień domyślnie, ale możesz je połączyć, definiując je jawnie.

Patrząc na zapis budowy można rzeczywiście znaleźć odpowiednią flagę tam: nazywa się -fobjc-arc (podobnie jak związana z nią flaga kompilatora). Po dodaniu tego ustawienia do innych znaczników linkera linker będzie zawierał bibliotekę ARC z główną wersją produktu, a kod powinien działać poprawnie.

+0

Wielkie dzięki, ta odpowiedź była ratunkiem dla życia po całym popołudniu, próbując to rozgryźć! – AliSoftware

+2

Ta opcja nie działa już od Xcode 4.3.2. '-fobjc-arc' wydaje się być nieprawidłową flagą dla narzędzia lib. ("nieznany znak opcji' f 'w: -fobjc-arc ") –

+3

Mogę potwierdzić, że działa on w Xcode 4.3.2. Po prostu to zrobiłem, a kompilator nie narzekał na nic podczas budowania symulatora. – csotiriou

5

Dodaję nową odpowiedź, ponieważ poprzednie zaakceptowane rozwiązanie nie działa już z Xcode 4.3.2. Mogę tylko założyć, że flaga linkera -fobjc-arc nigdy nie powinna zostać ujawniona i została usunięta.

To wydaje się być znanym problemem, chociaż the only thread I can find on this z kimś z Apple komentującym devforums pochodzi z połowy 2011 roku. Od tego wątku, sugeruje się, że ręczne łączenie następujący plik rozwiązuje problem:

${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a 

Wymaga to, aby być z wykorzystaniem najnowszych kompilacji kompilatora/SDK chociaż. Przesyłam tę odpowiedź bez testowania, poproś o jej sprawdzenie, jeśli to nie pomoże!

+0

Przeładowanie, ponieważ jest to przydatne uzupełnienie. Nie testowałem jeszcze. – zoul

+1

DEVROOT nie działa dla mnie. Użyłem: '$ (PLATFORM_DEVELOPER_USR_DIR)/lib/arc' w ścieżkach wyszukiwania biblioteki i specyficznej dla urządzenia flagi linkera dla' -larclite_iphoneos' –

+0

Przydatne dodawanie, ale jeszcze nie znalazłem powodu, dla którego po prostu dodawanie -fobjc-arc w flagi linkera nadal działają dla mnie w Xcode 4.3.2 – csotiriou