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 비트 아키텍처의 큰 혼란을 설명 할 수 있습니까?Architectures
Valid architectures
Architectures
답변
빌드 설정의 아키텍처를 표준 아키텍처 (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은 아키텍처 섹션을 크게 변경했습니다. 이 답변 은 후속 조치가 될 것입니다.
이것을 확인하십시오
답변
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에서만 실행됩니다.
답변
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에도 불구하고)에 직접 영향을주지 않으며 낮은 수준의 포인터 처리로 더 많은 작업을 수행해야하기 때문입니다. 컴파일러는 마법과 최적화를 수행합니다.
답변
지원되는 아키텍처에서 arm64 설정을 제거 하여 컴파일러를 armv7 및 armv7s 로만 제한 할 필요가 없습니다 . 배포 대상 설정을 5.1.1로 설정하기 만하면 됩니다.
중요 참고 : 고정 값만있는 드롭 다운이므로 빌드 설정 섹션 에서 배포 대상을 5.1.1로 설정할 수 없습니다 . 그러나 텍스트 필드에 값을 입력하기 만하면 애플리케이션 설정의 일반 섹션 에서 쉽게 5.1.1로 설정할 수 있습니다 .