Wydaje się, że możemy - teoretycznie - zbudować pojedynczą bibliotekę statyczną, która zawiera zarówno symulator, jak i iPhone'a i iPada.
Jednak Apple nie ma na ten temat żadnej dokumentacji, a domyślne szablony Xcode NIE są skonfigurowane do tego.
Szukam prostej, przenośnej i nadającej się do ponownego wykorzystania techniki, którą można wykonać w Xcode.
Trochę historii:
- W 2008 r. Mogliśmy tworzyć pojedyncze biblioteki statyczne zawierające zarówno kartę SIM, jak i urządzenie. Apple wyłączył to.
- Przez cały 2009 rok stworzyliśmy pary bibliotek statycznych - jedną dla SIM, drugą dla urządzenia. Apple też to teraz wyłączyło.
Bibliografia:
To świetny pomysł, jest to doskonałe podejście, ale nie działa: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- W jego skrypcie są pewne błędy, co oznacza, że działa on tylko na jego komputerze - powinien używać BUILT_PRODUCTS_DIR i / lub BUILD_DIR zamiast ich „zgadywania”)
- Najnowszy Xcode firmy Apple uniemożliwia robienie tego, co zrobił - po prostu nie będzie działać, ze względu na (Udokumentowaną) zmianę sposobu, w jaki Xcode przetwarza obiekty docelowe)
Inny SO pytający zapytał, jak to zrobić BEZ xcode i odpowiedzi, które skupiły się na części arm6 vs arm7 - ale zignorował część i386: jak skompilować bibliotekę statyczną (tłuszcz) dla armv6, armv7 i i386
- Od najnowszych zmian Apple'a część symulatora nie jest już taka sama jak różnica arm6 / arm7 - to inny problem, patrz wyżej)
Odpowiedzi:
ALTERNATYWY:
Łatwe kopiowanie / wklejanie najnowszej wersji (ale instrukcje instalacji mogą ulec zmianie - patrz poniżej!)
Biblioteka Karla wymaga znacznie więcej wysiłku, aby skonfigurować, ale o wiele ładniejsze długoterminowe rozwiązanie (konwertuje bibliotekę do frameworka).
Skorzystaj z tego, a następnie popraw go, aby dodać obsługę kompilacji archiwów - patrz komentarz @ Frederika na temat zmian, których używa, aby ładnie działał w trybie archiwizacji.
OSTATNIE ZMIANY: 1. Dodano obsługę systemu iOS 10.x (przy zachowaniu obsługi starszych platform)
Informacje o tym, jak używać tego skryptu z projektem osadzonym w innym projekcie (chociaż zdecydowanie nie polecam tego robić, nigdy - Apple ma kilka błędów show-stopper w Xcode, jeśli osadzasz projekty między sobą, z Xcode 3.x do Xcode 4.6.x)
Dodatkowy skrypt pozwalający na automatyczne dołączanie pakietów (tj. Dołączanie plików PNG, PLIST itp. Z biblioteki!) - patrz poniżej (przewiń w dół)
teraz obsługuje iPhone5 (używając obejścia Apple do błędów w lipo). UWAGA: instrukcje instalacji uległy zmianie (prawdopodobnie mogę to uprościć, zmieniając skrypt w przyszłości, ale nie chcę teraz ryzykować)
Sekcja „kopiuj nagłówki” uwzględnia teraz ustawienie kompilacji dla lokalizacji nagłówków publicznych (dzięki uprzejmości Frederika Wallnera)
Dodano wyraźne ustawienie SYMROOT (może trzeba też ustawić OBJROOT?), Dzięki Dougowi Dickinsonowi
SCRIPT (to jest to, co musisz skopiować / wkleić)
Aby uzyskać instrukcje użytkowania / instalacji, patrz poniżej
ZAINSTALUJ INSTRUKCJE
... wykorzystanie BONUS OPCJONALNE:
Jeśli nie możesz znaleźć pliku wyjściowego, oto obejście:
Dodaj następujący kod na samym końcu skryptu (dzięki uprzejmości Frederika Wallnera): otwórz „$ {CREATING_UNIVERSAL_DIR}”
Apple usuwa wszystkie dane wyjściowe po 200 wierszach. Wybierz swój cel, aw fazie uruchamiania skryptu MUSISZ odznaczyć: „Pokaż zmienne środowiskowe w dzienniku kompilacji”
jeśli używasz niestandardowego katalogu „build output” dla XCode4, wtedy XCode umieszcza wszystkie „nieoczekiwane” pliki w niewłaściwym miejscu.
... to jest lokalizacja twojej Uniwersalnej Kompilacji.
Jak dołączyć do projektu pliki „bez kodu źródłowego” (PNG, PLIST, XML itp.)
Skrypt do automatycznego kopiowania wbudowanych pakietów do tego samego folderu, co biblioteka statyczna FAT:
źródło
Spędziłem wiele godzin próbując zbudować grubą bibliotekę statyczną, która będzie działać na Armv7, Armv7s i symulatorze. Wreszcie znalazłem rozwiązanie .
Istotą jest oddzielne zbudowanie dwóch bibliotek (jednej dla urządzenia, a następnie jednej dla symulatora), zmień ich nazwy, aby się od siebie odróżnić, a następnie utwórz je lipo w jednej bibliotece.
Próbowałem i działa!
źródło
Stworzyłem szablon projektu XCode 4, który pozwala tworzyć uniwersalne ramy tak łatwo, jak tworzenie zwykłej biblioteki.
źródło
Istnieje narzędzie wiersza polecenia
xcodebuild
i możesz uruchamiać polecenie powłoki w xcode. Jeśli więc nie masz nic przeciwko użyciu skryptu niestandardowego, ten skrypt może ci pomóc.Może wygląda nieefektywnie (nie jestem dobry w skryptach powłoki), ale łatwo go zrozumieć. Skonfigurowałem nowy cel, w którym działa tylko ten skrypt. Skrypt jest przeznaczony dla wiersza poleceń, ale nie został przetestowany w :)
Podstawową koncepcją jest
xcodebuild
ilipo
.Próbowałem wielu konfiguracji w interfejsie Xcode, ale nic nie działało. Ponieważ jest to rodzaj przetwarzania wsadowego, więc bardziej odpowiedni jest projekt wiersza polecenia, dlatego Apple stopniowo usuwał funkcję kompilacji wsadowej z Xcode. Więc nie oczekuję, że w przyszłości będą oferować funkcję kompilacji wsadowej opartą na interfejsie użytkownika.
źródło
Potrzebowałem grubej biblioteki statycznej dla JsonKit, więc stworzyłem projekt biblioteki statycznej w Xcode, a następnie uruchomiłem ten skrypt bash w katalogu projektu. Tak długo, jak skonfigurowałeś projekt xcode z wyłączoną opcją „Buduj aktywną konfigurację”, powinieneś otrzymać wszystkie architektury w jednym pliku lib.
źródło
Aktualizacja IOS 10:
Miałem problem z budowaniem fatlib z iPhoneos 10.0, ponieważ wyrażenie regularne w skrypcie oczekuje tylko 9.x i niższych i zwraca 0.0 dla iOS 10.0
aby to naprawić, po prostu wymień
z
źródło
Zrobiłem to w szablon Xcode 4 , w tym samym stylu co szablon statyczny Karla.
Odkryłem, że budowanie statycznych ram (zamiast zwykłych bibliotek statycznych) powodowało przypadkowe awarie LLVM z powodu widocznego błędu linkera - więc sądzę, że biblioteki statyczne są nadal przydatne!
źródło
Dobra robota! Zhakowałem razem coś podobnego, ale musiałem to uruchomić osobno. Udział w procesie kompilacji sprawia, że jest to o wiele prostsze.
Jedna uwaga. Zauważyłem, że nie kopiuje żadnego z plików dołączanych, które oznaczysz jako publiczne. Dostosowałem to, co miałem w moim skrypcie, do twojego i działa całkiem dobrze. Wklej następujące elementy na końcu skryptu.
źródło
Właśnie napisałem własny skrypt do tego celu. Nie używa Xcode. (Opiera się na podobnym skrypcie w projekcie Gambit Scheme).
Zasadniczo uruchamia ./configure i tworzy trzy razy (dla i386, armv7 i armv7s) i łączy każdą z wynikowych bibliotek w grubą bibliotekę lib.
źródło