วิธีสร้างสถาปัตยกรรม armv6 และ armv7 ด้วย iOS 5


96

ในiOS5แอปเปิ้ลหยดARMv6สถาปัตยกรรมจากARCHS_STANDARD_32_BIT

เพื่อให้การสนับสนุนiPhone3Gฉันยังคงต้องการรวบรวมในarmv6แม้ใน iOS5

มีใครหาวิธีแก้ปัญหานี้ไหม

คำตอบ:


96

วันนี้ฉันเพิ่งสร้างบางสิ่งบางอย่างโดยระบุเป้าหมายการปรับใช้ iOS 4.0 ด้วยเฉพาะ armv7 ที่ระบุไว้ในสถาปัตยกรรม Xcode เตือนฉันว่าเพื่อรองรับสิ่งที่ต่ำกว่า iOS4.2 ฉันต้องรวม armv6 ไว้ในสถาปัตยกรรม เพียงแก้ไขช่องนั้นคลิกปุ่ม "+" เมื่อกล่องโต้ตอบปรากฏขึ้นและป้อน "armv6" ตามตัวอักษร

ในกรณีของฉันเราต้องการให้แอปของเราทำงานภายใต้ iOS4 และ iOS5 เราต้องทำการปรับเปลี่ยนบางอย่างเพื่อให้มันทำงานได้อย่างถูกต้องภายใต้ iOS5 แต่การเปลี่ยนแปลงทั้งหมดนั้นทำได้ด้วยการเปลี่ยนแปลงโค้ดที่เป็นมิตรกับ iOS4

นอกจากนี้เรายังเพิ่มความสามารถเฉพาะของ iOS5 ในลักษณะที่ทำให้แอปทำงานได้โดยไม่หยุดทำงานภายใต้ iOS4 โดยเฉพาะอย่างยิ่งเราได้ทดสอบความสามารถของ iOS5 ก่อนที่จะลองใช้งานและเชื่อมโยงไลบรารี iOS5 เท่านั้นเป็นตัวเลือก

ดังนั้นการรองรับ iPhone3G ในโลก iOS5 อาจหมายความว่า "เราต้องการให้แอปของเราทำงานบน iOS4 ขึ้นไป (ไม่ว่าจะใช้ฟีเจอร์ iOS5 ใดก็ตาม)" แทนที่จะเป็น "เราต้องการให้แอปของเราทำงานบนอุปกรณ์รุ่นเก่าที่ใช้ iOS5 ". มีความแตกต่างที่นี่ ลองคิดดู :-)

อย่างไรก็ตามการเพิ่มการสนับสนุน armv6 กลับเข้ามานั้นง่ายมาก และฉันเดาว่าประเด็นก็คือเมื่อถึงจุดหนึ่งเมื่อไม่มีอุปกรณ์ armv6 อีกต่อไปให้ต้องกังวล (ไม่ว่าด้วยเหตุผลใดก็ตาม) คุณจะไม่ต้องสร้างมันขึ้นมา มุมมองของ Apple คือทุกคนควรอัปเกรดเป็นฮาร์ดแวร์รุ่นล่าสุดโดยเร็วที่สุด ดังนั้นในโลกนั้นจึงไม่จำเป็นต้องมีเครื่องมือใด ๆ ที่จะต้องใช้ค่าเริ่มต้นใด ๆ นอกจากสิ่งใหม่ล่าสุดและยิ่งใหญ่ที่สุดเช่นกัน :-) โชคดี (หรือเปล่า) นักพัฒนาของเราอาศัยอยู่ในโลกแห่งความเป็นจริงและตระหนักดีว่าคุณต้องสนับสนุนสิ่งที่เก่ากว่าสักพัก และฉันเดาว่าทีม Xcode dev ก็รู้เรื่องนี้เช่นกันนั่นคือเหตุผลที่คุณสามารถเพิ่มการสนับสนุน armv6 กลับได้อย่างง่ายดาย


3
ขอบคุณสำหรับคำตอบที่แม่นยำ :-) อันที่จริงฉันต้องการใช้งานแอพของฉันบน iPhone 3G ที่ใช้ iOS 4.2.1 หรือต่ำกว่า (จำกัด ที่ 4.0) และมีคุณสมบัติเฉพาะของ iOS 5 สำหรับอุปกรณ์ปัจจุบัน ฉันไม่ได้ลองเพียงแค่เพิ่ม "armv6" ในสถาปัตยกรรมฉันกำลังมองหาตัวแปรสภาพแวดล้อมเช่น ARCHS_STANDARD_32_BIT และฉันเพิ่งพบ ARCHS_UNIVERSAL_IPHONE_OS แต่ดูเหมือนจะไม่ได้ผล
iGranDav

3
ต้องการเพิ่มว่าวิธีแก้ปัญหาจำนวนมากแนะนำว่าควรพูดว่า "armv6 armv7" - สิ่งนี้ไม่ได้ผลสำหรับฉัน ขณะนี้มีเพียง "armv6 $ (ARCHS_STANDARD_32_BIT)" เท่านั้นที่ใช้ได้สำหรับฉันหมายความว่าอย่ากำจัดสิ่งที่มีอยู่เพียงแค่เพิ่ม "armv6" ในการตั้งค่าสถาปัตยกรรม
วงเล็บ

1
ฉันทำทั้งหมดนี้แล้วและบิลด์ของฉันก็ยังล้มเหลว - เหตุผลก็คือฉันมีการสร้างรุ่น (ไม่ได้ใช้) รุ่นที่ตั้งไว้เป็นเป้าหมายการปรับใช้ของ iOS 5.0 ในขณะที่การแก้จุดบกพร่องและการแจกจ่ายถูกตั้งค่าเป็น 3.0 และดูเหมือนว่าจะหยุดการสร้าง xcode สำหรับ armv6 การตั้งค่าเป้าหมายการปรับใช้เป็น 3.0 สำหรับรุ่นทั้งหมดช่วยแก้ปัญหาได้
Simon East

6
มันไม่ได้ผลสำหรับฉัน (แม้ว่าจะเพิ่ม 'armv6' แล้วก็ตาม) แอพไม่ปรากฏบน iPod touch ของฉันด้วยซ้ำ แต่แล้วฉันก็ค้นพบว่า 'ความสามารถของอุปกรณ์ที่จำเป็น' (ใต้แท็บข้อมูล) มี armv7 อยู่ในนั้น ฉันเพิ่งลบมันและมันก็เริ่มทำงานได้อย่างสมบูรณ์
Erpheus

1
โดยทั่วไปฉันใช้ $ (VALID_ARCHS) ซึ่งเหมาะกับฉัน ฉันเพิ่งพบว่าโครงการใหม่เพิ่มข้อกำหนดความสามารถ 'arm7' ด้วย ฉันเพิ่งลบไปและทุกอย่างก็ใช้ได้ดี
Gordon Dove

51

คำตอบง่ายๆคือคุณต้องเปลี่ยนการตั้งค่าปัจจุบันจาก "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" ให้เป็น "armv6" และ "armv7" ดูภาพด้านล่าง คุณต้องลบบรรทัดที่มีการตั้งค่าก่อนหน้านี้เพื่อให้ใช้งานได้

แก้ไขการตั้งค่าสำหรับ armv6 และ armv7


3
ขอบคุณที่อธิบายเรื่องนี้ด้วยรูปภาพ - มันทำให้ชัดเจนจริงๆ
radven

11

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่านี้ในโครงการและเป้าหมาย ... ฉันเสียเวลาหนึ่งชั่วโมงในการคิดออก ได้ตั้งค่าไว้สำหรับหนึ่ง แต่ไม่ใช่อีกอัน หวังว่านี่จะช่วยได้ GLTA


นอกจากนี้หากคุณมีไลบรารีใด ๆ คุณต้องตั้งค่าในโครงการและกำหนดเป้าหมายที่นั่น
William Jockusch

9

ฉันคิดว่ามีเหตุผลที่ Apple ทิ้ง armv6 จากค่ามาตรฐาน

ฉันได้รวบรวม armv7 / armv6 ด้วย iOS5 SDK แล้วอย่างไรก็ตามคอมไพเลอร์ armv6 สร้างรหัสผิดในโหมดเผยแพร่ หลังจากผ่านไปหลายชั่วโมงในการค้นหาวิธีแก้ปัญหา (ลองใช้ llvm หรือ gcc ด้วยระดับการเพิ่มประสิทธิภาพที่แตกต่างกัน) ฉันยอมแพ้

ดังนั้นฉันจะกลับไปใช้ iOS SDK 4.x ตราบใดที่ฉันรองรับอุปกรณ์ armv6 รุ่นเก่า

ตัวอย่างรหัส:

// 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
นี่เป็นปัญหาที่เป็นที่รู้จักกับ LLVM Compiler 3.0 ใน Xcode 4.2 และ structs CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 การปิดใช้งานการสร้าง Thumb บน armv6 จะป้องกันข้อผิดพลาดประเภทนี้
Brad Larson

ว้าว! ฉันดีใจมากสำหรับคำตอบของคุณสิ่งนี้ก็เกิดขึ้นกับฉันเช่นกัน
Clafou

7

ไม่แน่ใจว่านี่เป็นวิธีแก้ปัญหาจริงหรือไม่ แต่ฉันได้ค้นพบว่าการแทนที่สตริงที่กำหนดใน "สถาปัตยกรรม" ซึ่งเป็น $ (ARCHS_STANDARD_32_BIT) ด้วย "armv6 armv7" ทำให้ฉันสามารถคอมไพล์โดยใช้ iOS5 เป็นฐานและ iOS4 เป็นการปรับใช้ เป้าหมายและผ่านการตรวจสอบความถูกต้อง

ฉันไม่ได้ใช้ไลบรารีหรือการโทรพิเศษเฉพาะ IOS5 แต่ตั้งใจจะใช้ในรุ่นถัดไป


1

ฉันไม่จำเป็นต้องแทนที่ $ (ARCHS_STANDARD_32_BIT) ด้วย armv7 เพื่อให้แอปรวบรวมและอัปโหลดไปยัง App Store

ตามที่ MarkGranoff แนะนำฉันเพียงแค่เพิ่ม armv6 เป็นข้อความธรรมดาโดยการกดปุ่มบวกแล้วพิมพ์ในบรรทัดที่สอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.