Xcode 5 및 iOS 7 : 아키텍처 및 유효한 아키텍처


82

Xcode 5에서 새 프로젝트를 시작하고 있습니다. iOS SDK 7배포 대상을 사용하여 응용 프로그램을 개발하고 싶습니다 iOS 5.0. Xcode에서 새 프로젝트를 만들고 배포 대상을 5.0으로 변경하려고하면 다음 메시지가 표시됩니다.

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.

그래서 아키텍처를 Standard(64 비트 없음)으로 변경했습니다 . 나는 컴파일하고 실행하지만 방금 일어난 일을 정말로 이해하지 못합니다. Xcode 프로젝트 빌드 설정의 및 설정

의 차이점은 무엇입니까 ? 64 비트를 제외하도록 설정 하면 64 비트 iPhone 또는 iOS 시뮬레이터에서 앱을 실행하면 어떻게 되나요? 새로운 64 비트 아키텍처의 큰 혼란을 설명 할 수 있습니까?ArchitecturesValid architectures
Architectures

여기에 이미지 설명 입력


Apple 개발자 포럼을 살펴 보셨습니까? 이것에 대한 많은 게시물이 있습니다. devforums.apple.com/message/887506#887506
trojanfoe

답변:


123

빌드 설정의 아키텍처를 표준 아키텍처 (armv7, armv7s)로 설정합니다.

여기에 이미지 설명 입력

iPhone 5S는 A7 64 비트 프로세서로 구동됩니다. 에서 사과 문서

Xcode는 32 비트 및 64 비트 바이너리를 모두 포함하여 앱을 빌드 할 수 있습니다. 이 결합 된 바이너리는 iOS 7 이상의 최소 배포 대상이 필요합니다.

참고 : Xcode의 향후 버전에서는 iOS 6 이상에서 32 비트 런타임을 지원하고 iOS 7에서 64 비트 런타임을 지원하는 단일 앱을 만들 수 있습니다.

내가 이해 한 문서에서

  • Xcode는 단일 앱에 대해 64 비트 32 비트 바이너리를 모두 만들 수 있지만 배포 대상은 iOS7이어야합니다. 그들은 미래에 iOS 6.0이 될 것이라고 말하고 있습니다.
  • 32 비트 바이너리는 iPhone 5S (64 비트 프로세서)에서 잘 작동합니다.

업데이트 (Xcode 5.0.1) Xcode 5.0.1
에서는 iOS 5.1.1 이상을위한 64 비트 바이너리 생성 지원을 추가했습니다.

Xcode 5.0.1은 32 비트 및 64 비트 바이너리를 모두 포함하여 앱을 빌드 할 수 있습니다. 이 결합 된 바이너리는 iOS 5.1.1 이상의 최소 배포 대상이 필요합니다. 64 비트 바이너리는 iOS 7.0.3 이상을 실행하는 64 비트 기기에서만 실행됩니다.

업데이트 (Xcode 5.1)
Xcode 5.1은 아키텍처 섹션을 크게 변경했습니다. 이 답변 은 후속 조치가 될 것입니다. 이것을 확인하십시오


내 질문에 적었 듯이 이미 해냈습니다. 제 질문은 그것이 무엇이 바뀌고 그 아래에서 일어나는 일에 관한 것입니다.
Crazy Yoghurt 2013 년

편집에 대해 : 그래서 포함 된 바이너리에 관한 것입니까? 64 비트를 제외하도록 아키텍처를 설정하면 iPhone 5S가 32 비트 바이너리를 실행합니까?
Crazy Yoghurt 2013 년

편집 정보 : 최소 배포 대상은 iOS 7.0이 아닌 iOS 6.0이어야한다고 생각합니다. @CrazyYoghurt 예, Mac과 마찬가지로 64 비트 컴퓨터는 32 비트 바이너리를 실행할 수 있습니다. 그렇지 않으면 64 비트 컴퓨터는 처음 도입 될 때 실행할 것이 없습니다.
trojanfoe 2013 년

현재 iOS7 배포 대상이있는 5s 및 기타 장치에서 앱을 작동하려면 iOS 7.0이어야합니다
Anil Varghese 2013 년

3
@CrazyYoghurt 그럼 당신은 드롭해야합니다 arm64.
trojanfoe 2013 년

9

Apple Docs에서 이해했습니다.

  • Xcode 빌드 설정에 아키텍처 (ARCHS) 는 무엇입니까 ?
    • 바이너리가 TARGETED 인 아키텍처를 지정 합니다. 둘 이상의 아키텍처를 지정하면 생성 된 바이너리에 지정된 각 아키텍처에 대한 개체 코드가 포함될 수 있습니다.
  • Xcode 빌드 설정에 유효한 아키텍처 (VALID_ARCHS) 는 무엇입니까 ?

    • 바이너리가 BUILT 일 수있는 아키텍처를 지정 합니다.
    • 빌드 프로세스 중에이 목록은 ARCHS와 교차되며 결과 목록은 바이너리가 실행될 수있는 아키텍처를 지정합니다.
  • 예 :-하나의 iOS 프로젝트에는 Xcode에 다음과 같은 빌드 설정이 있습니다.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • 이 경우 armv7 armv7s arm64 아키텍처 용으로 바이너리가 빌드됩니다. 그러나 동일한 바이너리는 ARCHS = armv7 armv7s에서만 실행됩니다.

9
아니, 여전히 나에서 지옥을 혼동 : S
Ade

"결과 목록"이란 무엇입니까 ??
DanMoore 2014 년

@DanMoore 설정된 교차 의 결과입니다 .
Slipp D. Thompson 2014-08-14

2
내가 실행하고 싶지 않은 아키텍처를 구축하는 이유를 찾을 수 있다면 이치에 맞을 것입니다.
rob5408

6

64 비트를 설정하면 결과 바이너리가 "Fat"바이너리가됩니다. 여기에는 얇은 fat 헤더와 함께 번들로 제공되는 3 개의 Mach-O 이미지가 모두 포함됩니다. otool 또는 jtool을 사용하여 확인할 수 있습니다. 다음과 같이 AVFoundation Framework와 같이 iOS 7.0 SDK의 일부로 포함 된 일부 팻 바이너리를 확인할 수 있습니다.

% 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)

바이너리 자체의 경우 ARM64 비트 명령어 세트를 사용합니다. 이는 대부분 32 비트와 호환되지만 완전히 다른 명령어 세트입니다. 이는 그래픽 프로그램 (NEON 명령어 및 레지스터 사용)에서 특히 중요합니다. 마찬가지로 CPU에는 더 많은 레지스터가 있으므로 프로그램 속도에 상당한 영향을 미칩니다. http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons 에서 이것이 차이를 만드는지 여부 에 대한 흥미로운 토론 이 있습니다. 벤치마킹 테스트는 지금까지 명확하게 나타납니다.

otool -tV를 사용하면 어셈블리가 덤프되며 (XCode 5 이상이있는 경우), 명령어 세트 차이를 직접 확인할 수 있습니다. 대부분의 (전부는 아님) 개발자는 변경 사항에 대해 무관심한 상태를 유지합니다. 대부분의 경우 Obj-C (CG * API에도 불구하고)에 직접 영향을주지 않으며 낮은 수준의 포인터 처리로 더 많은 작업을 수행해야하기 때문입니다. 컴파일러는 마법과 최적화를 수행합니다.


6

지원되는 아키텍처에서 arm64 설정을 제거 하여 컴파일러를 armv7armv7s 로만 제한 할 필요가 없습니다 . 배포 대상 설정을 5.1.1로 설정하기 만하면 됩니다.

중요 참고 : 고정 값만있는 드롭 다운이므로 빌드 설정 섹션 에서 배포 대상을 5.1.1로 설정할 수 없습니다 . 그러나 텍스트 필드에 값을 입력하기 만하면 애플리케이션 설정의 일반 섹션 에서 쉽게 5.1.1로 설정할 수 있습니다 .


5

간단한 수정 :

대상-> 빌드 설정-> 빌드 옵션-> 비트 코드 사용-> 아니오

iOS 9.3.3이 설치된 기기에서 작동


4

어떤 답변도 작동하지 않았고 프로젝트 -> 일반 -> 배포 정보 -> 배포 대상 -> 8.0 에서 찾을 수있는 최소 배포 대상을 설정하는 것을 잊었습니다.

예

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.