“ สถาปัตยกรรม” และ“ สถาปัตยกรรมที่ถูกต้อง” ในการตั้งค่า Xcode Build ต่างกันอย่างไร


คำตอบ:


113

สถาปัตยกรรมคือสิ่งที่คุณต้องการสร้างสถาปัตยกรรมที่ถูกต้องคือสิ่งที่คุณคิดได้จากการสร้างด้วยโค้ดเบสของคุณ

ดังนั้นคุณอาจต้องการสร้างไบนารีของคุณสำหรับ armv7s เท่านั้น แต่ซอร์สโค้ดเดียวกันจะรวบรวมได้ดีสำหรับ armv7 และ armv6 ดังนั้นVALID_ARCHS = armv6 armv7 armv7sแต่คุณตั้งARCHS = armv7sเพราะนั่นคือทั้งหมดที่คุณจริงต้องการที่จะสร้างด้วยรหัสของคุณ

หรือใน Apple-ese:

ARCHS (สถาปัตยกรรม)

รายการตัวระบุที่คั่นด้วยช่องว่าง ระบุสถาปัตยกรรม (ABI, โมเดลตัวประมวลผล) ที่ไบนารีถูกกำหนดเป้าหมาย เมื่อการตั้งค่าการสร้างนี้ระบุมากกว่าหนึ่งสถาปัตยกรรมไบนารีที่สร้างขึ้นอาจมีรหัสออบเจ็กต์สำหรับแต่ละสถาปัตยกรรมที่ระบุ

และ:

VALID_ARCHS (สถาปัตยกรรมที่ถูกต้อง)

รายการตัวระบุที่คั่นด้วยช่องว่าง ระบุสถาปัตยกรรมที่อาจสร้างไบนารี ในระหว่างการสร้างรายการนี้จะถูกตัดกับค่าของการตั้งค่าการสร้าง ARCHS รายการผลลัพธ์ระบุสถาปัตยกรรมที่ไบนารีสามารถทำงานได้ หากรายการสถาปัตยกรรมที่เป็นผลลัพธ์ว่างเปล่าเป้าหมายจะไม่สร้างไบนารี

ที่มา: การอ้างอิงการตั้งค่า Xcode Build

ในทางปฏิบัติคุณปล่อยให้VALID_ARCHSอยู่คนเดียวและไม่ต้องกังวลกับการเปลี่ยนแปลงและเพียงแค่ARCHSตั้งค่าสถาปัตยกรรมที่คุณต้องการสร้าง โดยทั่วไปคุณตั้งค่าการสร้างดีบักเป็นเพียงNATIVE_ARCHเพราะคุณต้องการสร้างเวอร์ชันดีบักสำหรับเครื่องที่คุณจะทดสอบ / ใช้งานและรุ่นที่วางจำหน่ายสำหรับสถาปัตยกรรมทั้งหมดที่คุณวางแผนจะรองรับ


1
@DanMoore "รายการสถาปัตยกรรมผลลัพธ์" จะทำในหน่วยความจำในเวลาสร้าง
Saltymule

3
@ onmyway133 ส่วนใหญ่คุณไม่ต้องการ VALID_ARCHS หากคุณกำลังเขียน inline asm สำหรับบางสถาปัตยกรรมเท่านั้นคุณอาจเปลี่ยน VALID_ARCHS เพื่อแสดงว่าโค้ดของคุณไม่ได้มีไว้สำหรับสถาปัตยกรรมใด ๆ อีกต่อไปนอกจากสถาปัตยกรรมเหล่านั้น แม้ว่าส่วนใหญ่แล้วมันเป็นเพียงแค่สัญญาณสำหรับคุณจาก Xcode ที่ระบุว่าสถาปัตยกรรมใดที่สามารถสร้างได้และคุณเลือกจากที่นั่นสำหรับ ARCHS ของคุณ
Jeremy W. Sherman

4

จากเอกสารแอปเปิ้ลเรารู้ว่าไบนารี Xcode จะสร้างรายการตัดกับValid Architectures Architectures

ดังนั้นฉันไม่คิดว่าคำตอบของ Jeremy นั้นถูกต้องอย่างที่เขาพูด:

ดังนั้นคุณอาจต้องการสร้างไบนารีของคุณสำหรับ armv7s เท่านั้น แต่ซอร์สโค้ดเดียวกันจะ
รวบรวมได้ดีสำหรับ armv7 และ armv6 ดังนั้นVALID_ARCHS = armv6 armv7 armv7sแต่คุณตั้งค่า ARCHS = armv7s เพราะนั่นคือทั้งหมดที่คุณต้องการสร้างด้วยโค้ดของคุณ

เมื่อคุณตั้งค่าVALID_ARCHS = armv6 armv7 armv7sและตั้งค่าARCHS = armv7sผลลัพธ์ของไบนารี Xcode จะสร้างคือ armv7s ซึ่งไม่สามารถทำงานร่วมกับ armv6 / armv7 ได้

และหากคุณต้องการใช้งานร่วมกับ armv6 / armv7 / armv7s, คุณต้องตั้งค่า VALID_ARCHS = armv6 armv7 armv7sและARCHS = armv6ด้วยวิธีนี้ผลลัพธ์ของไบนารี Xcode จะสร้างเป็น armv6 และสามารถทำงานได้ดีบนทั้ง armv6 / armv7 / armv7s เนื่องจากโปรเซสเซอร์ arm เข้ากันได้แบบย้อนกลับ .


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