iOS 5로 armv6 및 armv7 아키텍처 용으로 빌드하는 방법


96

에서 iOS5를 애플 방울 의 ARMv6의 로부터 아키텍처 ARCHS_STANDARD_32_BIT을 .

iPhone3G에 대한 지원을 유지하기 위해 iOS5에서도 armv6 에서 컴파일하고 싶습니다 .

누구든지 이것에 대한 해결책을 찾았습니까?

답변:


96

나는 오늘 iOS 4.0의 배포 대상을 지정하는 무언가를 구축했습니다. 아키텍처에 armv7 만 지정되어있는 상태에서 Xcode는 iOS4.2 이하의 모든 항목을 지원하려면 아키텍처에 armv6을 포함해야한다고 경고했습니다. 해당 필드를 편집하고 대화 상자가 나타나면 "+"버튼을 클릭하고 리터럴 "armv6"을 입력하면됩니다.

제 경우에는 앱이 iOS4 및 iOS5에서 작동하기를 원합니다. iOS5에서 제대로 작동하도록 약간의 수정이 필요했지만 이러한 모든 변경은 iOS4 친화적 인 코드 변경으로 이루어졌습니다.

또한 앱이 iOS4에서 충돌하지 않고 실행될 수 있도록 몇 가지 iOS5 관련 기능을 추가했습니다. 특히 iOS5 기능을 사용하기 전에 테스트했으며 iOS5 전용 라이브러리를 옵션으로 연결했습니다.

따라서 iOS5 세계에서 iPhone3G를 지원한다는 것은 "앱이 iOS5를 실행하는 구형 기기에서 실행되도록하고 싶습니다. ". 여기에는 차이가 있습니다. 그것에 대해 생각하십시오. :-)

어쨌든 armv6 지원을 다시 추가하는 것은 매우 쉽습니다. 요점은 이것이라고 생각합니다. 어떤 시점에서 (어떤 이유로 든) 걱정할 armv6 장치가 더 이상 없을 때이를 위해 구축 할 필요가 없습니다. Apple의 견해는 모든 사람이 가능한 한 빨리 최신 하드웨어로 업그레이드해야한다는 것입니다. 따라서 그 세계에서는 도구가 최신 및 가장 위대한 도구로 기본 설정 될 필요가 없습니다. :-) 다행스럽게도 (아니면), 우리 개발자들은 현실 세계에 살고 있으며 한동안 오래된 것들을 지원해야한다는 것을 알고 있습니다. 그리고 Xcode 개발 팀도 이것을 알고 있다고 생각합니다. 그래서 armv6 지원을 아주 간단하게 다시 추가 할 수 있습니다.


3
정확한 답변에 감사드립니다 :-) 실제로 iOS 4.2.1 이하 (4.0으로 제한)가 설치된 iPhone 3G에서 내 앱을 실행하고 현재 기기에 대한 iOS 5 특정 기능을 갖고 싶습니다. 단순히 아키텍처에 "armv6"을 추가하려고 시도하지 않았고 ARCHS_STANDARD_32_BIT와 같은 환경 변수를 찾고 있었는데 ARCHS_UNIVERSAL_IPHONE_OS를 찾았지만 작동하지 않는 것 같습니다.
iGranDav 2011 년

3
많은 솔루션이 "armv6 armv7"이라고 말해야한다는 것을 추가하고 싶었습니다. 이것은 저에게 효과가 없었습니다. 현재는 "armv6 $ (ARCHS_STANDARD_32_BIT)"만 작동합니다. 즉, 거기에있는 것을 제거하지 말고 아키텍처 설정에 "armv6"을 추가하기 만하면됩니다
brack

1
이 모든 작업을 수행했지만 빌드가 여전히 실패했습니다. 이유는 디버그 및 배포가 3.0으로 설정된 동안 iOS 5.0의 배포 대상으로 설정된 (사용되지 않은) 릴리스 빌드가 있었고 이것은 armv6에 대한 xcode 빌드를 중지하는 것 같습니다. 모든 빌드에 대해 배포 대상을 3.0으로 설정하면 문제가 해결되었습니다.
Simon East

6
나를 위해 작동하지 않았습니다 ( 'armv6'을 추가 한 후에도). 이 앱은 내 iPod touch에도 나타나지 않았습니다. 하지만 '필수 장치 기능'(정보 탭 아래)에 armv7이 있음을 발견했습니다. 난 그냥 삭제하고 완벽하게 실행 시작
Erpheus

1
나는 일반적으로 나를 위해 일하는 $ (VALID_ARCHS)를 사용합니다. 새로운 프로젝트에도 기능 요구 사항 'arm7'이 추가된다는 사실을 방금 발견했습니다. 방금 삭제했는데 모두 잘 작동합니다.
Gordon Dove

51

간단한 대답은 현재 설정을 "표준 (armv7)-$ (ARCHS_STANDARD_32_BIT)"에서 "armv6"및 "armv7"로 변경해야한다는 것입니다. 아래 이미지를 참조하십시오. 작동하려면 이전 설정으로 라인을 삭제해야합니다.

armv6 및 armv7에 대한 올바른 설정


3
이미지로 설명 해주셔서 감사합니다. 정말 명확 해졌습니다.
radven

11

또한 이것을 Project AND Targets에서 설정했는지 확인하십시오 ...이를 알아내는 데 한 시간이 걸립니다. 하나는 설정했지만 다른 하나는 설정하지 않았습니다. 도움이 되었기를 바랍니다. GLTA


또한 라이브러리가있는 경우 프로젝트 및 대상에서 설정해야합니다.
William Jockusch 2011

9

Apple이 표준 설정에서 armv6를 삭제 한 이유가 있다고 생각합니다.

iOS5 SDK로 armv7 / armv6을 컴파일했지만 armv6 컴파일러가 릴리스 모드에서 잘못된 코드를 생성했습니다. 해결 방법을 찾은 후 (다른 최적화 수준으로 llvm 또는 gcc 시도) 포기합니다.

따라서 이전 armv6 장치를 지원하는 한 iOS SDK 4.x로 돌아갑니다.

코드 예 :

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

메모리 손상이있을 수 있지만 armv7 컴파일러와 iOSSDK <5.0에서는 예상대로 작동합니다.

친애하는


또한 이전 기기의 armv6 빌드에서 이상한 버그가 발견되었습니다. 이것을 알아 냈습니까, 아니면 실제로 이전 XCode로 돌아가셨습니까? 또한 더 이상 이전 SDK를 다운로드 할 수 없습니다.
Craig McMahon

19
이것은 Xcode 4.2 및 CGPoint / CGSize 구조체의 LLVM 컴파일러 3.0에서 알려진 문제입니다 : devforums.apple.com/thread/122059?tstart=15 . armv6에서 Thumb 용 빌드를 비활성화하면 이러한 종류의 오류를 방지 할 수 있습니다.
Brad Larson

와! 나는 당신의 대답에 너무 기쁩니다. 이것은 나에게도 일어나고 있습니다.
Clafou

7

이것이 실제로 해결책인지 확실하지 않지만 $ (ARCHS_STANDARD_32_BIT) 인 "architectures"의 정의 된 문자열을 "armv6 armv7"로 바꾸면 iOS5를 기반으로, iOS4를 배포로 컴파일 할 수 있다는 것을 발견했습니다. target, pass validation.

IOS5 전용 라이브러리 나 호출을 사용하지 않지만 다음 릴리스에서 사용할 계획입니다.


1

앱을 컴파일하고 App Store에 업로드하기 위해 $ (ARCHS_STANDARD_32_BIT)를 armv7로 바꿀 필요가 없었습니다.

MarkGranoff가 제안한 것처럼, 저는 단순히 +를 누르고 두 번째 줄에 입력하여 armv6을 일반 텍스트로 추가했습니다.

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