Xcode 5 i iOS 7: architektura i prawidłowe architektury

82

Rozpoczynam nowy projekt w Xcode 5. Chcę tworzyć aplikacje przy użyciu, iOS SDK 7ale 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 Architecturesi Valid architecturesustawieniami w ustawieniach kompilacji projektu Xcode?
Jeśli Architectureswykluczę 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?

wprowadź opis obrazu tutaj

Crazy Yoghurt
źródło
Czy spojrzałeś na fora Apple Developer? Jest wiele postów na ten temat. devforums.apple.com/message/887506#887506
trojanfoe

Odpowiedzi:

123

Ustaw architekturę w ustawieniach kompilacji na architektury standardowe (armv7, armv7s)

wprowadź opis obrazu tutaj

iPhone 5S jest napędzany 64-bitowym procesorem A7. Z dokumentów Apple

Xcode może zbudować aplikację z dołączonymi 32-bitowymi i 64-bitowymi plikami binarnymi. Ten połączony plik binarny wymaga minimalnego celu wdrożenia systemu iOS 7 lub nowszego.

Uwaga: przyszła wersja Xcode umożliwi utworzenie pojedynczej aplikacji obsługującej 32-bitowe środowisko uruchomieniowe w systemie iOS 6 i nowszych oraz obsługującej 64-bitowe środowisko wykonawcze w systemie iOS 7.

Z dokumentacji zrozumiałem

  • Xcode może tworzyć zarówno 64-bitowe 32-bitowe pliki binarne dla jednej aplikacji, ale celem wdrożenia powinien być iOS7. Mówią, że w przyszłości będzie to iOS 6.0
  • 32-bitowy plik binarny będzie działał dobrze w telefonie iPhone 5S (procesor 64-bitowy).

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.

Xcode 5.0.1 może zbudować aplikację z dołączonymi 32-bitowymi i 64-bitowymi plikami binarnymi. Ten połączony plik binarny wymaga minimalnego celu wdrożenia systemu iOS 5.1.1 lub nowszego. 64-bitowy plik binarny działa tylko na urządzeniach 64-bitowych z systemem iOS 7.0.3 lub nowszym.

Aktualizacja (Xcode 5.1)
Xcode 5.1 wprowadził znaczącą zmianę w sekcji architektury. Ta odpowiedź będzie dla Ciebie kontynuacją. Sprawdź to

Anil Varghese
źródło
Jak napisałem w swoim pytaniu, już to zrobiłem. Moje pytanie dotyczy bardziej tego, co się zmienia i co dzieje się pod spodem.
Crazy Yoghurt
o edycji: Więc chodzi tylko o dołączone pliki binarne? Przy architekturze ustawionej na wykluczenie 64-bitowej wersji iPhone 5S będzie działać w wersji 32-bitowej?
Crazy Yoghurt
o edycji: Myślę, że minimalnym celem wdrożenia musi być iOS 6.0, a nie iOS 7.0. @CrazyYoghurt Tak, podobnie jak w przypadku komputerów Mac - 64-bitowe maszyny mogą uruchamiać 32-bitowe pliki binarne, w przeciwnym razie 64-bitowa maszyna nie miałaby nic do uruchomienia po pierwszym wprowadzeniu.
trojanfoe,
obecnie aplikacja do pracy na 5s i innych urządzeniach z celem wdrożenia iOS7 powinna być iOS 7.0
Anil Varghese
3
@CrazyYoghurt Więc musisz upuścić arm64.
trojanfoe,
9

Moje zrozumienie z Apple Docs.

  • Co to jest architektura (ARCHS) w ustawieniach kompilacji Xcode?
    • Określa architekturę / architektury, na które jest CELOWANY plik binarny . Jeśli określono więcej niż jedną architekturę, wygenerowany plik binarny może zawierać kod obiektowy dla każdej określonej architektury.
  • Co to są prawidłowe architektury (VALID_ARCHS) w ustawieniach kompilacji Xcode?

    • Określa architekturę / y, dla których plik binarny może być WBUDOWANY .
    • Podczas procesu budowania lista ta jest przecinana z ARCHS, a wynikowa lista określa architektury, na których może działać plik binarny.
  • Przykład: - Jeden projekt iOS ma następujące ustawienia kompilacji w Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • W tym przypadku plik binarny zostanie zbudowany dla architektur armv7 armv7s arm64. Ale ten sam plik binarny będzie działał TYLKO na ARCHS = armv7 armv7s.
sw_engineer
źródło
9
Nie, wciąż mnie dezorientuje: S
Ade
jaka jest „lista wynikowa”?
DanMoore
@DanMoore Wynik ustalonego przecięcia .
Slipp D. Thompson,
2
Miałoby sens, gdybym mógł znaleźć powód, dla którego zbudowałbym architekturę, na której nie chcę działać.
rob5408
6

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.

Technologeeks
źródło
6

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.

Kibernetik
źródło
5

Prosta poprawka:

Cele -> Ustawienia kompilacji -> Opcje kompilacji -> Włącz kod Bitcode -> Nie

Działa na urządzeniach z iOS 9.3.3

Maselko
źródło
4

Ż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

Przykład

tsuz
źródło