Rozpoczynam nowy projekt w Xcode 5. Chcę tworzyć aplikacje przy użyciu, iOS SDK 7
ale z celem wdrożenia iOS 5.0
. Gdy tylko utworzę nowy projekt w Xcode i spróbuję zmienić cel wdrożenia na 5.0, otrzymuję następujący komunikat:
Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.
Więc zmienione architektury na Standard
(nie 64-bitowe). Kompiluję, uruchamiam, ale nie bardzo rozumiem, co się stało.
Jaka jest różnica między ustawieniami Architectures
i Valid architectures
ustawieniami w ustawieniach kompilacji projektu Xcode?
Jeśli Architectures
wykluczę 64-bit, co się stanie, gdy uruchomię moją aplikację na 64-bitowym iPhonie lub symulatorze iOS (wiem, że to działa, jestem po prostu ciekawy, co się dzieje poniżej)?
Czy możesz wyjaśnić wielki bałagan dzięki nowej architekturze 64-bitowej?
Odpowiedzi:
Ustaw architekturę w ustawieniach kompilacji na architektury standardowe (armv7, armv7s)
iPhone 5S jest napędzany 64-bitowym procesorem A7. Z dokumentów Apple
Z dokumentacji zrozumiałem
Aktualizacja (Xcode 5.0.1)
W Xcode 5.0.1 dodali obsługę tworzenia 64-bitowych plików binarnych dla iOS 5.1.1 i nowszych.
Aktualizacja (Xcode 5.1)
Xcode 5.1 wprowadził znaczącą zmianę w sekcji architektury. Ta odpowiedź będzie dla Ciebie kontynuacją. Sprawdź to
źródło
arm64
.Moje zrozumienie z Apple Docs.
Co to są prawidłowe architektury (VALID_ARCHS) w ustawieniach kompilacji Xcode?
Przykład: - Jeden projekt iOS ma następujące ustawienia kompilacji w Xcode.
źródło
Po ustawieniu 64-bitowego wynikowego pliku binarnego jest plik binarny „Fat”, który zawiera wszystkie trzy obrazy Mach-O powiązane z cienkim, grubym nagłówkiem. Możesz to zobaczyć za pomocą otool lub jtool. Możesz sprawdzić kilka grubych plików binarnych zawartych w pakiecie SDK iOS 7.0, na przykład AVFoundation Framework, na przykład:
% cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/ %otool -V -f AVFoundation 9:36 Fat headers fat_magic FAT_MAGIC nfat_arch 3 architecture arm64 # The 64-bit version (A7) cputype CPU_TYPE_ARM64 cpusubtype CPU_SUBTYPE_ARM64_ALL capabilities 0x0 offset 16384 size 2329888 align 2^14 (16384) architecture armv7 # A5X - packaged after the arm64version cputype CPU_TYPE_ARM cpusubtype CPU_SUBTYPE_ARM_V7 capabilities 0x0 offset 2359296 size 2046336 align 2^14 (16384) architecture armv7s # A6 - packaged after the armv7 version cputype CPU_TYPE_ARM cpusubtype CPU_SUBTYPE_ARM_V7S capabilities 0x0 offset 4407296 size 2046176 align 2^14 (16384)
Jeśli chodzi o sam plik binarny, używa zestawu instrukcji bitowych ARM64, który jest (w większości kompatybilny z 32-bitowym, ale) zupełnie innym zestawem instrukcji. Jest to szczególnie ważne w przypadku programu graficznego (używającego instrukcji i rejestrów NEON). Podobnie procesor ma więcej rejestrów, co ma duży wpływ na szybkość programu. W http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons jest ciekawa dyskusja na temat tego, czy to robi różnicę; testy porównawcze do tej pory wyraźnie wskazywały, że tak.
Użycie otool -tV spowoduje zrzucenie zestawu (jeśli masz XCode 5 i nowsze), a następnie możesz zobaczyć różnice między zestawami instrukcji. Większość (ale nie wszyscy) deweloperów pozostanie agnostykami na zmiany, ponieważ w większości nie wpływają one bezpośrednio na Obj-C (niezależnie od CG * API) i muszą zrobić więcej z obsługą wskaźników niskiego poziomu. Kompilator wykona swoją magię i optymalizacje.
źródło
Nie musisz ograniczać kompilatora tylko do armv7 i armv7s , usuwając ustawienie arm64 z obsługiwanych architektur. Wystarczy ustawić cel wdrożenia na 5.1.1
Ważna uwaga: nie można ustawić celu wdrożenia na 5.1.1 w sekcji Ustawienia kompilacji, ponieważ jest to lista rozwijana ze stałymi wartościami. Ale możesz łatwo ustawić ją na 5.1.1 w sekcji Ogólne ustawień aplikacji, po prostu wpisując wartość w polu tekstowym.
źródło
Prosta poprawka:
Cele -> Ustawienia kompilacji -> Opcje kompilacji -> Włącz kod Bitcode -> Nie
Działa na urządzeniach z iOS 9.3.3
źródło
Żadna z odpowiedzi nie zadziałała, a potem zapomniałem ustawić minimalny cel wdrożenia, który można znaleźć w Projekt -> Ogólne -> Informacje o wdrożeniu -> Cel wdrożenia -> 8.0
źródło