Xcode 12 สร้างขึ้นสำหรับ iOS Simulator แต่เชื่อมโยงในไฟล์ออบเจ็กต์ที่สร้างขึ้นสำหรับ iOS สำหรับสถาปัตยกรรม arm64


314

กำลังพยายามสร้างโครงการขนาดใหญ่ (และทำงานบน Xcode 11!) ใน Xcode 12 (เบต้า 5) เพื่อเตรียมการสำหรับ iOS 14 ก่อนหน้านี้ Codebase เคยเป็น Obj-C แต่ตอนนี้มีทั้ง Obj-C และ Swift และใช้พ็อดที่มี Obj-C และ / หรือ Swift เช่นกัน

ฉันได้ดึง cocoapods เบต้าใหม่ด้วยการรองรับ Xcode 12 (ปัจจุบันคือ 1.10.0.beta 2)

การติดตั้งพ็อดสำเร็จ เมื่อฉันสร้างบิลด์ฉันได้รับข้อผิดพลาดต่อไปนี้บนเฟรมเวิร์กของพ็อด:

"การสร้างสำหรับ iOS Simulator แต่เชื่อมโยงในไฟล์ออบเจ็กต์ที่สร้างขึ้นสำหรับ iOS สำหรับสถาปัตยกรรม arm64"

เมื่อฉันไปรัน lipo -info บนเฟรมเวิร์กมันมี: armv7s armv7 i386 x86_64 arm64

ก่อนหน้านี้โครงการได้ตั้งค่า Valid Architectures เป็น: armv7, armv7s และ arm64

ใน Xcode 12 การตั้งค่านั้นจะหายไปตามเอกสารของ Apple สถาปัตยกรรมถูกตั้งค่าเป็น $ (ARCHS_STANDARD) ฉันไม่มีอะไรตั้งอยู่ในสถาปัตยกรรมที่ยกเว้น

ใครมีความคิดว่าจะเกิดอะไรขึ้นที่นี่? ฉันยังไม่สามารถทำซ้ำได้ด้วยโปรเจ็กต์ที่ง่ายกว่านี้


3
สิ่งนี้ใช้ได้กับฉัน: stackoverflow.com/questions/24924809/…
Narendar Singh Saini

ดูบทความ: milanpanchal24.medium.com/…
MilanPanchal

ฉันมี Apple Silicon M1 และยังคงพบข้อผิดพลาด arm64 นี้ ทำไมถึงเป็นเช่นนั้น?
Aspen

คำตอบ:


488

โดยทั่วไปคุณต้องยกเว้นarm64สถาปัตยกรรมจำลองทั้งจากโครงการของคุณและโครงการ Pod

  • ต้องการทำเช่นนั้นให้ไปที่การตั้งค่ารูปร่างของโครงการของคุณและเพิ่มAny iOS Simulator SDKมีค่าภายในarm64Excluded Architecture

    ใส่คำอธิบายภาพที่นี่

หรือ

  • หากคุณกำลังใช้XCConfigไฟล์ที่กำหนดเองคุณสามารถเพิ่มบรรทัดนี้เพื่อยกเว้นสถาปัตยกรรมจำลองได้
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

แล้ว

คุณต้องทำเช่นเดียวกันสำหรับโครงการ Podจนผู้ผลิตโกโก้ฝักจะทำต่อไปนี้ในการเพิ่มของพวกเขาPodspec

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

คุณสามารถเพิ่มExcluded Architechureในโครงการ Pod ของคุณตั้งค่ารูปร่างpod installแต่มันจะถูกเขียนทับเมื่อคุณใช้

แทนสิ่งนี้คุณสามารถเพิ่มข้อมูลโค้ดนี้ในPodfileไฟล์. มันจะเขียนการตั้งค่าการสร้างที่จำเป็นทุกครั้งที่คุณเรียกใช้pod install

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

4
รายละเอียดเพิ่มเติมเกี่ยวกับ CocoaPods ที่นี่เป็นสิ่งที่ดี โปรดทราบว่าหากไม่ทำ[sdk=iphonesimulator*]หลังจากEXCLUDED_ARCHSนั้น XCode จะไม่พบพ็อดของคุณเมื่อสร้างสำหรับอุปกรณ์จริงเนื่องจากไม่มีพ็อดใดที่สร้างขึ้นสำหรับ arm64
mwu

6
ทำงานให้ฉัน! โปรดทราบว่าpost_install do |installer|ใน Podfiles ส่วนใหญ่มีอยู่แล้วเนื่องจากฟลิปเปอร์ วางส่วนด้านในinstaller.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" endหลังflipper_post_install(installer)เส้น
Ramon Vermeulen

6
building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64ฉันได้รับ ต้องแก้ไขอย่างไร?
Sazzad Hissain Khan

3
โซลูชันนี้ยอดเยี่ยมมากและฉันจะเพิ่มว่าหากคุณกำลังสร้างพ็อดของคุณเองโปรดสังเกตโดยเฉพาะ 2 บรรทัดที่ผู้เขียนแนะนำหลังจาก "... จนกว่าผู้ขายโกโก้ทั้งหมดจะเพิ่มใน Podspec ของพวกเขา" เนื่องจากไม่มีสิ่งเหล่านี้ Podspec ในเฟรมเวิร์กของฉันเองทำให้เกิดความล้มเหลวที่เป็นขุยเมื่อฉันพยายามผลักดันมันไปที่ repo ส่วนตัวของฉัน ขอบคุณ!
Danny

1
การแก้ปัญหามีข้อบกพร่องที่ทำให้เกิดปัญหาเนื่องจากผู้เขียนข้อมูลจำเพาะของพ็อดได้พบและใช้โซลูชันนี้ ส่วนที่เป็นปัญหาคือการใช้user_target_xcconfig. เนื่องจากข้อกำหนดของพ็อดหลายรายการกำหนดค่าที่แตกต่างกันเนื่องจากEXCLUDED_ARCHSมีความขัดแย้งกันและ CocoaPods ส่งคำเตือนเช่นนี้[!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.การอ้างอิงทางไวยากรณ์ของ podspec ระบุว่าแอตทริบิวต์นี้ "ไม่แนะนำ" guide.cocoapods.org/syntax/podspec.html#user_target_xcconfig
leberwurstsaft

119

TL; DR;

ตั้งค่า "Build Active Architecture Only ( ONLY_ACTIVE_ARCH)" เป็นYesสำหรับไลบรารี / แอปของคุณแม้กระทั่งในโหมดเผยแพร่


ในขณะที่พยายามระบุสาเหตุที่แท้จริงของปัญหาฉันได้ตระหนักถึงข้อเท็จจริงที่น่าสนใจเกี่ยวกับ Xcode 12

  1. Xcode 12 เป็นก้าวสำคัญของ Apple Silicon ซึ่งน่าเสียดายที่ยังไม่มีวางจำหน่าย แต่ด้วยแพลตฟอร์มนั้นเราจะได้รับ macOS ที่ใช้ arm64 ซึ่งเครื่องจำลองจะทำงานบนสถาปัตยกรรม arm64 ซึ่งแตกต่างจากสถาปัตยกรรม x86_64 ที่ใช้ Intel ในปัจจุบัน

  2. Xcode มักจะขึ้นอยู่กับ "Run Destination" เพื่อสร้างไลบรารี / แอป ดังนั้นเมื่อเครื่องจำลองถูกเลือกเป็น "Run Destination" ระบบจะสร้างแอปสำหรับสถาปัตยกรรมจำลองที่พร้อมใช้งานและเมื่ออุปกรณ์ได้รับเลือกให้เป็น "Run Destination" ระบบจะสร้างสำหรับสถาปัตยกรรมที่อุปกรณ์รองรับ ( arm*)

  3. xcodebuildในระบบสร้าง Xcode 12+ ถือว่าarm64เป็นสถาปัตยกรรมที่ถูกต้องสำหรับโปรแกรมจำลอง ดังนั้นเมื่อเครื่องจำลองถูกเลือกให้เป็นปลายทางการทำงานก็อาจพยายามรวบรวม / เชื่อมโยง libs / แอปของคุณกับarm64เครื่องจำลองที่ใช้งานได้เช่นกัน (ยังไม่พร้อมใช้งาน) ดังนั้นมันจึงส่งclang(++)แฟล็ก - เป้าหมายบางอย่างเช่นarm64-apple-ios13.0-simulatorในรูปแบบ <architecture> - <os> - <sdk> - <platform> และเสียงดังกราวพยายามสร้าง / เชื่อมโยงกับตัวจำลองที่ใช้ arm64 ซึ่งในที่สุดก็ล้มเหลวบน mac ที่ใช้ Intel

  4. แต่xcodebuildจะลองใช้กับรุ่นที่วางจำหน่ายเท่านั้น ทำไม? เนื่องจากONLY_ACTIVE_ARCHโดยปกติแล้วการตั้งค่าบิวด์ "Build Active Architecture Only ( )" จะตั้งค่าเป็น "ไม่ใช่" สำหรับการกำหนดค่า "Release" เท่านั้น และนั่นหมายความว่าxcodebuildจะพยายามสร้างรูปแบบสถาปัตยกรรมทั้งหมดของ libs / แอพของคุณสำหรับปลายทางการเรียกใช้ที่เลือกสำหรับรุ่นรุ่น และสำหรับปลายทางการทำงานของ Simulator นั้นจะรวมทั้งสองอย่างx86_64และarm64ตอนนี้เนื่องจากarm64ใน Xcode 12+ ยังเป็นสถาปัตยกรรมที่รองรับสำหรับเครื่องจำลองเพื่อรองรับ Apple Silicon

เพียงแค่วาง Xcode จะล้มเหลวในการสร้างแอปของคุณได้ตลอดเวลาก็พยายามที่บรรทัดคำสั่งxcodebuild(ซึ่งเป็นค่าเริ่มต้นที่จะปล่อยสร้างให้ดูที่แท็บทั่วไปของการตั้งค่าโครงการของคุณ) หรืออื่น ๆ และพยายามที่จะสร้างสายพันธุ์สถาปัตยกรรมการสนับสนุนโดยปลายทางวิ่ง วิธีแก้ปัญหาง่ายๆสำหรับปัญหานี้คือการตั้งค่า "Build Active Architecture Only ( ONLY_ACTIVE_ARCH)" เป็นใช่ในไลบรารี / แอปของคุณแม้กระทั่งในโหมดเผยแพร่

ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่

หากรวมไลบรารีเป็นพ็อดและคุณสามารถเข้าถึงได้.podspecคุณสามารถตั้งค่า:

spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'ใช่'}

spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'} # ไม่แนะนำ

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

อย่างไรก็ตามหากคุณไม่สามารถเข้าถึงได้.podspecคุณสามารถอัปเดตการตั้งค่าระหว่างการติดตั้งพ็อดได้ตลอดเวลา:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
    end
  end
end

สิ่งหนึ่งที่ฉันกังวลเกี่ยวกับผลกระทบของสิ่งนี้เมื่อเราเก็บ libs / apps จริงๆ ในระหว่างการเก็บแอปโดยปกติจะใช้การกำหนดค่า "Release" และเนื่องจากนี่จะเป็นการสร้างรุ่นโดยพิจารณาเฉพาะสถาปัตยกรรมที่ใช้งานอยู่ของปลายทางการรันปัจจุบันด้วยวิธีนี้เราอาจสูญเสียชิ้นส่วนสำหรับ armv7, armv7s ฯลฯ จากการสร้างเป้าหมาย อย่างไรก็ตามฉันสังเกตเห็นเอกสารระบุว่า (ไฮไลต์ในรูปภาพที่แนบมา) ว่าการตั้งค่านี้จะถูกละเว้นเมื่อเราเลือก "อุปกรณ์ iOS ทั่วไป / อุปกรณ์ใด ๆ " เป็นปลายทางการรันเนื่องจากไม่ได้กำหนดสถาปัตยกรรมเฉพาะใด ๆ ดังนั้นฉันเดาว่าเราน่าจะดีถ้าเราเก็บแอพของเราโดยเลือกว่าเป็นปลายทางการรัน


1
นี่เป็นการเปลี่ยนแปลงที่น่าแปลกใจจริงๆจาก Apple และทำให้ฉันเสียเวลาครึ่งวันในการคิดว่าฉันรู้สึกว่า Apple ควรชดเชย :) นี่ไม่ใช่การอัปเดตแบบมีเอกสาร (อย่างน้อยก็อย่างที่ฉันรู้) และแน่นอนว่าจะส่งผลกระทบต่อทุกคนที่อัปเกรดเป็น Xcode 12 ฉันหวังแค่ว่าทุกคนจะพบวิธีของตัวเองที่จะแก้ไขได้เมื่อพวกเขารู้พื้นฐานแล้ว
Ayan Sengupta

1
หากรายละเอียดฝักหลายคนใช้user_target_xcconfigและค่านิยมที่ไม่ตรงกับตรง CocoaPods จะเปล่งคำเตือนเช่นนี้[!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.อ้างอิงไวยากรณ์ podspec กล่าวว่าแอตทริบิวต์นี้ "ไม่แนะนำ" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig ดังนั้นโปรดอย่าใช้user_target_xcconfigเพื่อช่วยให้นักพัฒนาหลายคนประสบปัญหา
leberwurstsaft

2
ขวา! และฉันคิดว่าฉันได้พูดถึงสิ่งนั้นแล้วในคำตอบของฉัน
Ayan Sengupta

1
ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดเพราะมันไม่ได้ทำลายการสร้างด้วย Xcode 11 ฉันใช้การตั้งค่านี้กับโปรเจ็กต์ทั้งหมดจากนั้นฉันไม่จำเป็นต้องตั้งค่าสำหรับพ็อดหรือเป้าหมายแยกกัน และใช้งานได้ทั้งบน Xcode 11.7 และ Xcode 12 ที่ไม่รวมส่วนโค้งarm64จะถูกแมปใน Xcode 11.7 x86_64ดังนั้นจึงไม่รวมสถาปัตยกรรมหลักสำหรับการจำลอง
Wojciech Kulik

2
ฉันจัดการเพื่อให้ทุกอย่างทำงานได้ในที่สุดด้วย 'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64' แต่เฉพาะใน pod_target_xcconfig และเฉพาะในพ็อดปัญหา (ซึ่งรวมไลบรารีที่สร้างไว้ล่วงหน้า) และพ็อดเดียวที่ขึ้นอยู่กับ พ็อดปัญหา อย่างอื่นถูกทิ้งให้สะอาด ฉันตัดสินใจว่าฉันชอบที่จะใช้โซลูชันโค้งที่ใช้งาน
Airsource Ltd

72

พบทางออก! https://developer.apple.com/forums/thread/657913

หากคุณตั้งค่าสถาปัตยกรรมที่ยกเว้นสำหรับตัวจำลองเป็น arm64 จะคอมไพล์

ไม่รวมสถาปัตยกรรมสำหรับการจำลอง


พอใช้ปัญหาที่ฉันพบคือกับไลบรารีที่เชื่อมโยงด้วยตนเอง แต่ก็ไม่ได้ทำให้เกิดปัญหากับพ็อดของเราที่เราใช้เช่นกัน
SlashDevSlashGnoll

5
ฉันกำลังทดสอบในโหมดReleaseดังนั้นฉันจึงต้องเพิ่มเข้าไปใน Release ด้วย
MujtabaFR

ฉันคิดว่าเราจะกลับมาทำธุรกิจอีกครั้งหลังจากโพสต์นี้ ขอบคุณที่ช่วย
JBarros35

@btxios ฉันพบปัญหา "ARCHS [@]: unbound variable" เมื่อสร้างที่เก็บถาวร คุณสามารถแก้ไขปัญหานี้ได้หรือไม่
ArdenDev

50

การตั้งค่าการสร้างสถาปัตยกรรมที่ถูกต้องถูกลบออกใน Xcode 12 หากคุณมีค่าในการตั้งค่าบิลด์นี้สิ่งเหล่านี้ทำให้เกิดปัญหาและจำเป็นต้องลบออก

ฉันสามารถ "ล้าง" การตั้งค่าบิลด์ VALID_ARCHS ได้โดยเพิ่มกลับเข้าไปในการตั้งค่าบิลด์ที่กำหนดโดยผู้ใช้ (โดยไม่มีค่าใด ๆ ) เรียกใช้โปรเจ็กต์ (ซึ่งล้มเหลว) จากนั้นจึงลบการตั้งค่าบิลด์ VALID_ARCHS หลังจากนั้นฉันก็สามารถทำงานบนเครื่องจำลองได้

การตั้งค่าการสร้างสถาปัตยกรรมของฉันคือสถาปัตยกรรมมาตรฐาน

คุณสามารถเพิ่มการตั้งค่าที่กำหนดโดยผู้ใช้จากปุ่มบวกในการตั้งค่าการสร้าง:

การตั้งค่าที่ผู้ใช้กำหนด


9
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ตรวจสอบให้แน่ใจว่าโครงการแอปไม่ได้เลือกเป้าหมาย มิฉะนั้นคุณจะไม่สามารถลบ VALID_ARCHS จาก Build Settings ได้ :)
Bionicle

2
@trishcode แม้ว่าหลังจากทำสิ่งนี้แล้วฉันก็ได้รับข้อผิดพลาดเดียวกัน (xcode12 beta4) การแก้ไขปัญหาใด ๆ
Sivakrishna Perla

3
@SivakrishnaPerla หากคุณสามารถเปิดโปรเจ็กต์ใน Xcode 11 คุณจะเห็นว่าเป้าหมายใดถูกใช้กับ Valid Architectures คุณสามารถล้างการตั้งค่าใน Xcode 11 แล้วลองโครงการอีกครั้งใน Xcode 12 หากคุณยังต้องการวิธีแก้ปัญหาและคุณได้รับข้อผิดพลาดในกรอบงานที่ฝังไว้คำตอบของ SlashDevSlashGnoll ควรใช้งานได้ หากคุณต้องการวิธีแก้ปัญหาและคุณได้รับข้อผิดพลาดใน Cocoapod ให้ยกเว้นสถาปัตยกรรม arm64 ในการติดตั้งโพสต์ Podfile
trishcode

1
@trishcode ขอบคุณการตั้งค่า arm64 ในสถาปัตยกรรมที่ยกเว้นและการลบ VALID_ARCHS ใช้งานได้
Sivakrishna Perla

1
ถ้าฉันลบ VALID_ARCHS และเพิ่ม arm64 ในสถาปัตยกรรมที่ยกเว้นฉันได้รับข้อผิดพลาดนี้ - ตรวจสอบการอ้างอิงไม่มีสถาปัตยกรรมที่จะคอมไพล์สำหรับ (ARCHS = arm64 x86_64, VALID_ARCHS =, EXCLUDED_ARCHS = (arm64))
nOOb iOS

14

Xcode 12.3

ฉันแก้ไขปัญหานี้โดยตั้งค่า Validate Workspace เป็น Yes

ใส่คำอธิบายภาพที่นี่


แก้ไขปัญหาของฉันขอบคุณ!
Declan Land

1
ไม่ได้แก้ปัญหาของฉัน
Aspen

แก้ไขปัญหาของฉัน แก้ไขง่ายที่สุด! ฉันดีใจที่ได้รับการแก้ไข แต่จะมีใครอธิบายได้ไหมว่าวิธีนี้ช่วยแก้ปัญหาได้อย่างไร
njdeveloper

11

หากคุณมีปัญหาใน Xcode 12 กับเครื่องจำลองไม่ใช่อุปกรณ์จริงคุณต้องลบการตั้งค่าVALID_ARCHSเนื่องจากไม่ได้รับการสนับสนุนอีกต่อไป ไปที่ "builds settings" ค้นหา " VALID_ARCHS " และลบคุณสมบัติที่ผู้ใช้กำหนดเอง ทำได้ในทุกเป้าหมายที่คุณมี

ถึงกระนั้นคุณอาจต้องเพิ่มสคริปต์ที่ด้านล่างของ podfile เพื่อให้พ็อดที่รวบรวมด้วยสถาปัตยกรรมที่เหมาะสมและเป้าหมายการปรับใช้:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
     end
  end
end

การลบออกVALID_ARCHSจากโครงการของฉันใช้งานได้ดี ฉันไม่ได้เปลี่ยนอะไรให้กับโครงการ podfile หรือ pods
ÁngelTéllez

9

หลังจากอัปเกรดเป็น Xcode 12 ฉันยังสามารถสร้างสำหรับอุปกรณ์จริงได้ แต่ไม่ใช่เครื่องจำลอง การสร้าง Podfile ใช้งานได้กับอุปกรณ์จริงเท่านั้น

ฉันลบ VALID_ARCHS ภายใต้ Build Settings> User-Defined และใช้งานได้! ทุบหัวฉันสักพักก่อนจะพบสิ่งนี้


8

สำหรับฉันการตั้งค่าต่อไปนี้ใช้งานได้:

สร้างการตั้งค่า >> สถาปัตยกรรมที่ไม่รวม

เพิ่ม "arm64" ในทั้งโหมด Release และ Debug สำหรับตัวเลือก "Any iOS Simulator SDK"

ใส่คำอธิบายภาพที่นี่


6

ฉันเชื่อว่าฉันพบคำตอบแล้ว ตามบันทึกประจำรุ่น Xcode 12 beta 6:

" ตัวแก้ไขการตั้งค่าบิวด์ไม่รวมการตั้งค่าการสร้างสถาปัตยกรรมที่ถูกต้อง (VALID_ARCHS) อีกต่อไปและไม่สนับสนุนการใช้งาน แต่จะมีการตั้งค่าการสร้างสถาปัตยกรรมที่ยกเว้นใหม่ (EXCLUDED_ARCHS) แทนหากโปรเจ็กต์มี VALID_ARCHS การตั้งค่าจะแสดงในผู้ใช้ - ส่วนที่กำหนดของตัวแก้ไขการตั้งค่าการสร้าง (15145028) "

ฉันสามารถแก้ไขปัญหานี้ได้โดยการแก้ไขไฟล์โครงการด้วยตนเอง (ฉันไม่สามารถหาวิธีลบรายการออกจากไฟล์โครงการโดยใช้ Xcode) และลบบรรทัดทั้งหมดที่อ้างถึง VALID_ARCHS หลังจากนั้นฉันสามารถสร้างตัวจำลองได้ดี


1
เมื่อใช้ Xcode VALID_ARCHS จะอยู่ใน Select Project (ไม่ใช่ Target) จากนั้นเลือก `` Build Setting -> User-Defined "เลือกและลบออก
Akshay

วิธีนี้ใช้ได้ผลสำหรับฉัน วิธีแก้ปัญหาที่คนอื่นแนะนำไม่ได้ผลเพียงแค่การเพิ่มค่า 'arm64' ลงในฟิลด์ 'สถาปัตยกรรมที่ไม่รวม' เริ่มให้ข้อผิดพลาด 'การอนุญาตไฟล์' สำหรับไฟล์. app ที่สร้างขึ้น
archeopetrix

6

ฉันแก้ปัญหาโดยเพิ่ม "arm64" ใน "สถาปัตยกรรมที่ยกเว้น" สำหรับทั้งเป้าหมายโครงการและเป้าหมายพ็อด

Xcode -> โครงการเป้าหมาย -> การตั้งค่าการสร้าง -> สถาปัตยกรรมที่ยกเว้น> "arm64"

Xcode -> Pod Target -> การตั้งค่าการสร้าง -> สถาปัตยกรรมที่ยกเว้น> "arm64"



5

ในคุณ xxx.framework ไฟล์ podspec เพิ่ม follow config หลีกเลี่ยง pod package มี arm64 similator archs

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

มันได้ผล! อย่างไรก็ตามหมายความว่า Pod ไม่สามารถใช้กับ Mac ที่ใช้ Apple Silicon ได้?
tomacco

ได้รับการยืนยัน @tomacco หรือไม่?
Fernando Reynoso

2
@FernandoReynoso ฉันเพิ่งได้รับ Developer Transition Kit (ARM MacMini) จะทดสอบและรายงานในภายหลังในวันนี้
tomacco

@tomacco คุณสามารถทดสอบได้หรือไม่?
Houman

หากรายละเอียดฝักหลายคนใช้user_target_xcconfigและค่านิยมที่ไม่ตรงกับตรง CocoaPods จะเปล่งคำเตือนเช่นนี้[!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.อ้างอิงไวยากรณ์ podspec กล่าวว่าแอตทริบิวต์นี้ "ไม่แนะนำ" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig ดังนั้นโปรดอย่าใช้user_target_xcconfigเพื่อช่วยให้นักพัฒนาหลายคนประสบปัญหา
leberwurstsaft

4

ฉันมีปัญหาในการสร้างกรอบงานจากบรรทัดคำสั่ง เฟรมเวิร์กของฉันขึ้นอยู่กับเฟรมเวิร์กอื่นที่ไม่มีการรองรับสำหรับตัวจำลองที่ใช้ ARM ฉันลงเอยด้วยการยกเว้นการสนับสนุนสำหรับเครื่องจำลองที่ใช้ ARM จนกว่าฉันจะอัพเกรดการอ้างอิง

ฉันต้องการEXCLUDED_ARCHS=arm64แฟล็กเมื่อสร้างเฟรมเวิร์กสำหรับตัวจำลองจาก CLI

xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64

1
เหมือนกันที่นี่ ที่สำคัญ "ปัญหา" -destination "generic/platform=iOS Simulator"ในสถานการณ์นี้เป็นจริงสำหรับการสร้างปลายทางทั่วไปผ่าน สิ่งนี้นำไปสู่การสร้างสถาปัตยกรรมที่มีอยู่ทั้งหมดซึ่งรวมถึง arm64 ตั้งแต่ Xcode 12
Sascha

4

หลังจากลองเกือบทุกโพสต์ในหัวข้อนี้และอ่านผ่านฟอรัมนักพัฒนาแอปเปิ้ลฉันพบว่ามีเพียงวิธีเดียวที่ใช้ได้กับฉัน

ฉันกำลังสร้างเฟรมเวิร์กสากลที่ใช้ในแอพที่รวดเร็ว ฉันไม่สามารถสร้างไปยัง Simulator โดยไม่มีข้อผิดพลาดทางสถาปัตยกรรม

ในโครงการ Framework ของฉันฉันมีงาน Universal Framework ในขั้นตอนการสร้างของฉันถ้าเป็นกรณีนี้สำหรับคุณ

  • เพิ่มสิ่งต่อไปนี้ในxcodebuildงานของคุณภายในขั้นตอนการสร้าง: EXCLUDED_ARCHS="arm64"

ถัดไปคุณต้องเปลี่ยนโครงการต่อไปนี้Build Settings:

  • ลบการVALID_ARCHSตั้งค่าที่ผู้ใช้กำหนด
  • ตั้งค่าONLY_ACTIVE_ARCHเป็นYES***

*** หากคุณกำลังพัฒนาเฟรมเวิร์กและมีแอพสาธิตด้วยเช่นกันการตั้งค่านี้จะต้องเปิดใช้งานในทั้งสองโปรเจ็กต์


4

อัปเดต: ต.ค. 2020

คุณสามารถตั้งค่าarm64สำหรับDebug > Simulator - iOS 14.O SDKภายใต้สถาปัตยกรรมที่ยกเว้นเท่านั้น

ใส่คำอธิบายภาพที่นี่


3

สำหรับนักพัฒนา Pod ใน Podspec ของคุณให้เพิ่ม:

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

จากนั้นในโครงการตัวอย่างของคุณ ตัวอย่างการตั้งค่าไฟล์โครงการ

ดูการทำงานในโครงการนี้


หากรายละเอียดฝักหลายคนใช้user_target_xcconfigและค่านิยมที่ไม่ตรงกับตรง CocoaPods จะเปล่งคำเตือนเช่นนี้[!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.อ้างอิงไวยากรณ์ podspec กล่าวว่าแอตทริบิวต์นี้ "ไม่แนะนำ" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig ดังนั้นโปรดอย่าใช้user_target_xcconfigเพื่อช่วยให้นักพัฒนาหลายคนประสบปัญหา
leberwurstsaft

2

ฉันยังประสบปัญหาเดียวกันกับไลบรารีเฉพาะที่ติดตั้งผ่านคาร์เธจ สำหรับผู้ที่ใช้ Carthage เนื่องจาก Carthage ใช้ Xcode 12 ไม่ได้เอกสารนี้จะแนะนำวิธีแก้ปัญหาที่ใช้ได้กับกรณีส่วนใหญ่ ในไม่ช้า Carthage ก็สร้างเฟรมเวิร์กไขมันซึ่งหมายความว่าเฟรมเวิร์กมีไบนารีสำหรับสถาปัตยกรรมที่รองรับทั้งหมด จนกว่าจะมีการเปิดตัว Apple Sillicon ทุกอย่างทำงานได้ดี แต่ตอนนี้มีความขัดแย้งเนื่องจากมีสถาปัตยกรรมที่ซ้ำกัน (arm64 สำหรับอุปกรณ์และ arm64 สำหรับเครื่องจำลอง) ซึ่งหมายความว่า Carthage ไม่สามารถเชื่อมโยงกรอบงานสถาปัตยกรรมเฉพาะกับกรอบไขมันเดียว

คุณสามารถทำตามคำแนะนำได้ที่นี่ คาร์เธจ XCODE 12

หลังจากนั้นคุณกำหนดค่า Carthage ใส่ arm64 ใน "สถาปัตยกรรมที่ยกเว้น" ในการตั้งค่าบิลด์ ใส่คำอธิบายภาพที่นี่

พยายามเรียกใช้โครงการของคุณโดยใช้โปรแกรมจำลอง โปรแกรมจำลองควรทำงานโดยไม่มีข้อผิดพลาดใด ๆ


1

ปัญหาที่นี่คือสถาปัตยกรรมที่ถูกต้องใน Xcode 11 เปิดโปรเจ็กต์ใน Xcode 11 และเปลี่ยนค่าสถาปัตยกรรมที่ถูกต้องเป็น $ (ARCHS_STANDARD) สำหรับทั้งโปรเจ็กต์เป้าหมายและพ็อดของคุณเปิดโปรเจ็กต์อีกครั้งใน Xcode 12 และสร้าง


1

ตั้งค่าการ"Build Active Architecture Only"(ONLY_ACTIVE_ARCH)สร้างเป็นใช่xcodeกำลังขอ arm64 เนื่องจากสถาปัตยกรรม Silicon MAC ซึ่งเป็น arm64

arm64 ได้รับการเพิ่มเป็นส่วนโค้งจำลองใน Xcode12 เพื่อรองรับ Silicon MAC

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json


ถ้ามันไม่ได้ทำงานบนซิลิกอน Mac แน่นอนว่ามันไม่ควรใช้ arm64?
โจนาธาน

@ โจนาธาน. ใช่มันควรจะทำแบบนั้น แต่ตอนนี้มันยังไม่ใช่
Aravind

1

ในกรณีของฉัน: Xcode 12

ฉันตั้งค่าว่างไว้EXCLUDED_ARCHSและตั้งค่าONLY_ACTIVE_ARCHDebug = YESRelease = NO Project's Build Setting

และฉันรวมสิ่งนี้ไว้ใน Podfile ของฉัน:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
    end
end

มันทำงานบนเครื่องจำลอง iPhone 8 (iOS 12) และ iPhone 11 Pro Max (iOS 14) และบนอุปกรณ์ iPhone 7 Plus (iOS 13.4) ของฉัน


1

เกี่ยวกับBuild Settingsการค้นหาแล้วกดVALID_ARCH deleteสิ่งนี้ควรจะใช้ได้กับฉันกับ Xcode 12.0.1

VALID_ARCH ในการตั้งค่าบิวด์


2
ฉันไม่พบVALID_ARCHนี่คืออะไร?
Houman

1

เพียง แต่เพิ่มAny iOS Simulator SDK -> x86_64การProject's Build Settings -> VALID_ARCHSทำงานสำหรับฉัน

เวอร์ชัน Xcode: 12.1 (12A7403)

ใส่คำอธิบายภาพที่นี่

หากโปรเจ็กต์ของคุณมีเฟรมเวิร์กบางส่วนที่ไม่รองรับ x86_64

  • คุณสามารถเพิ่มชื่อเฟรมเวิร์กเหล่านี้ ( xxx.framework) ลงในTarget -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDKเพื่อ
  • และจากนั้นก็ปรับเปลี่ยนเพื่อลบเส้นทางกรอบเหล่านี้สำหรับFramework Search PathsDebug -> Any iOS Simulator SDK

การตั้งค่าทั้งสองนี้สามารถหลีกเลี่ยง Xcode เพื่อสร้างและเชื่อมโยงเฟรมเวิร์กเหล่านี้ในโหมดจำลอง

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่


1

ฉันเข้าใจปัญหาเกี่ยวกับ arm64 และ Xcode 12 และฉันสามารถแก้ไขปัญหาการสร้างได้โดยการยกเว้นสถาปัตยกรรม arm64 สำหรับ iPhone Simulator หรือโดยการตั้งค่า ONLY_ACTIVE_ARCH สำหรับรูปแบบการวางจำหน่าย อย่างไรก็ตามฉันยังมีปัญหาในการผลักดันเฟรมเวิร์กของฉันโดยใช้ pod repo push

ฉันพบว่าการตั้งค่า s.pod_target_xcconfig ใน podspec ของฉันไม่ได้ใช้การตั้งค่านี้กับการอ้างอิงที่กำหนดไว้ใน podspec เดียวกัน ฉันเห็นมันในโปรเจ็กต์แอพจำลองที่ Cocoapods กำลังสร้างระหว่างการตรวจสอบความถูกต้อง การตรวจสอบความถูกต้องของ Cocoapods กำลังเรียกใช้โครงร่างการเปิดตัวสำหรับโปรแกรมจำลองและสิ่งนี้จะล้มเหลวเมื่อการอ้างอิงอย่างน้อยหนึ่งรายการไม่รวม arm64 หรือไม่ได้ตั้งค่าให้สร้างสถาปัตยกรรมที่ใช้งานอยู่เท่านั้น

วิธีแก้ปัญหาอาจเป็นการบังคับให้ Cocoapods เพิ่มสคริปต์หลังการติดตั้งในขณะที่ตรวจสอบความถูกต้องของโปรเจ็กต์หรือปล่อยให้สร้างโครงร่างการดีบักเนื่องจากโครงร่างการดีบักกำลังสร้างสถาปัตยกรรมที่ใช้งานอยู่เท่านั้น

ฉันลงเอยด้วยการใช้ Xcode 11 เพื่อปล่อยพ็อดของฉันเพื่อผ่านการตรวจสอบความถูกต้อง คุณสามารถดาวน์โหลด Xcode 11 จาก developer.apple.com คัดลอกไปยังโฟลเดอร์โปรแกรมเป็น Xcode11.app sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developerและสลับใช้ อย่าลืมสลับกลับเมื่อทำเสร็จแล้ว


1

หลังจากลองค้นหาวิธีแก้ปัญหาต่างๆแล้วฉันคิดว่าวิธีที่ปลอดภัยที่สุดคือการเพิ่มรหัสต่อไปนี้ที่ส่วนท้ายของPodfile

post_install do |pi|
   pi.pods_project.targets.each do |t|
       t.build_configurations.each do |bc|
          bc.build_settings['ARCHS[sdk=iphonesimulator*]'] =  `uname -m`
       end
   end
end

วิธีนี้คุณจะลบล้างสถาปัตยกรรมคอมไพเลอร์ของโปรแกรมจำลอง iOS เป็นสถาปัตยกรรมซีพียูปัจจุบันของคุณเท่านั้น เมื่อเทียบกับคนอื่น ๆ , การแก้ปัญหานี้จะทำงานบนคอมพิวเตอร์ที่มีแอปเปิ้ลซิลิกอน


เป็นเรื่องดีที่เห็นใครบางคนเข้าใจปัญหาอย่างน้อยและไม่ได้แนะนำให้ลบการสนับสนุน Apple Silicon สำหรับ iOS Simulator เท่านั้น
Camsoft

0

ในกรณีของฉัน:

ฉันมีการกำหนดค่า 4 แบบ (+ DebugQa และ ReleaseQa) Cocoapods ถูกใช้เป็นตัวจัดการการพึ่งพา

สำหรับ Debug ฉันรวบรวมบนอุปกรณ์และในโปรแกรมจำลองและบน qa บนอุปกรณ์เท่านั้น

ช่วยในการตั้งค่า BuildActiveArchitecture เป็นใช่ใน PodsProject


0

ในกรณีของฉันฉันพยายามรันบนโปรแกรมจำลอง watchOS 7 ในโหมด Relese แต่ตัวจำลอง iOS 14 อยู่ในโหมดดีบัก

ดังนั้นเพียงแค่ใส่ทั้งสองซิมในโหมด Debug / Release ก็แก้ปัญหาให้ฉันได้!


0

สลับการกำหนดค่า Build กลับไปที่โหมด Debug หรือเปิด Build Active Architecture Only สำหรับทั้งโหมด Debug และ Release เหตุผลคือไลบรารี / เฟรมเวิร์กของคุณไม่รองรับสถาปัตยกรรม Simulator ใหม่ ARM64 (ทำงานบน Mac พร้อมโปรเซสเซอร์ Apple Silicon)


0

เพิ่มบรรทัด "arm64" (ไม่มีเครื่องหมายอัญประกาศ) ไปที่เส้นทาง: Xcode -> โครงการ -> การตั้งค่าการสร้าง -> สถาปัตยกรรม -> สถาปัตยกรรมที่ยกเว้นนอกจากนี้ให้ทำเช่นเดียวกันสำหรับ Pods ในทั้งสองกรณีสำหรับทั้งฟิลด์ดีบักและรีลีส

หรือโดยละเอียด ...

ข้อผิดพลาดที่กล่าวถึงที่นี่ขณะปรับใช้กับโปรแกรมจำลองโดยใช้ Xcode 12 ก็เป็นหนึ่งในสิ่งที่ส่งผลกระทบต่อฉันเช่นกัน เพียงคลิกขวาที่แต่ละโปรเจ็กต์ของฉันและแสดงในโปรแกรมค้นหาเปิด. xcodeproj ใน Atom จากนั้นไปที่. pbxproj และลบการตั้งค่า VALIDARCHS ทั้งหมด นี่คือสิ่งที่ทำให้ฉันได้ผล ลองทำตามคำแนะนำอื่น ๆ (ไม่รวม arm64, Build Active Architecture Only) ซึ่งดูเหมือนว่าจะทำให้งานสร้างของฉันไปได้ไกลขึ้น แต่สุดท้ายก็ปล่อยให้ฉันมีข้อผิดพลาดอื่น การมีการตั้งค่า VALIDARCH อยู่รอบ ๆ อาจเป็นสิ่งที่ดีที่สุดในการตรวจสอบก่อน


0

แบ่งปันวิธีแก้ปัญหาที่ได้ผลสำหรับฉันซึ่งอาจช่วยใครบางคนได้

ปัญหาเมื่อรวบรวมโปรแกรมจำลอง:

สร้างสำหรับ iOS Simulator แต่เชื่อมโยงในไฟล์ออบเจ็กต์ที่สร้างขึ้นสำหรับ iOS สำหรับสถาปัตยกรรม arm64

XCODE 12.1, POD 1.9.1

โครงสร้างโครงการของฉัน

  • เป้าหมายหลัก
  • แบ่งปันส่วนขยาย
  • ส่วนขยายบริการการแจ้งเตือน
  • โมดูลย่อยกรอบที่กำหนดเอง
  • Podfile
  1. เพิ่มarm64ในการตั้งค่าการสร้าง -> Exclude Architectureในเป้าหมายทั้งหมด

ใส่คำอธิบายภาพที่นี่

  1. ลบออกarm64จากVALID_ARCHSและเพิ่มx86_64ในเป้าหมายทั้งหมด

ใส่คำอธิบายภาพที่นี่

  1. เพิ่มรหัสต่อไปนี้ใน podfile

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
     end
    end
    
  2. ทำpod updateลบpodfile.lockและทำpod install

  3. สร้างความสะอาด


0

หลังจากลองใช้คำตอบที่ไร้ประโยชน์มากมายทางออนไลน์ สิ่งนี้ใช้ได้กับฉัน

ขั้นแรกสร้าง x86_64 สำหรับโครงการ Pod !!!!

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ARCHS'] = "arm64 x86_64"
        end
    end
end

ประการที่สองเพิ่ม "x86_64" สำหรับ VALID_ARCHS

ใส่คำอธิบายภาพที่นี่

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