แฟล็ก -all_load linker ทำอะไร


123

ฉันไม่พบว่าแฟล็ก -all_load ทำอะไรเมื่อคอมไพล์โค้ด Objective-C

ฉันมีปัญหาบางอย่างในการอัปโหลดไบนารีไปยัง Apple พวกเขาบอกว่าเป็นเพราะฉันไม่ได้ใช้แฟล็กนี้ แต่โค้ดของฉันรวบรวมได้แม้ว่าจะไม่มีก็ตาม

มีใครช่วยฉันได้ไหม

ขอบคุณ


2
โดยปกติแล้วข้อผิดพลาดใด ๆ ที่คุณเห็นจะเกิดขึ้นกับอุปกรณ์เมื่อเรียกใช้แอปพลิเคชัน คุณกำลังบอกว่าคุณไม่ได้ทดสอบแอปพลิเคชันของคุณกับฮาร์ดแวร์จริงก่อนที่ Apple จะส่งให้ตรวจสอบ? ถ้าเป็นเช่นนั้นนั่นเป็นความคิดที่แย่มาก
Brad Larson

ฉันได้ทดสอบแล้วอย่างไรก็ตามการกำหนดค่า "การแจกจ่าย" ของฉันซึ่งเป็นส่วนที่มีโปรไฟล์การจัดสรรแอปสโตร์ - ไม่มีการตั้งค่าสถานะและการทดสอบทั้งหมดทำโดยใช้โปรไฟล์การพัฒนาซึ่งมีการตั้งค่าสถานะดังนั้นทุกอย่างจึงดูโอเคและเมื่อใด ฉันรวบรวมสำหรับแอพสโตร์ที่มีโปรไฟล์การแจกจ่ายแฟล็กถูกปิดและเนื่องจากไม่สามารถติดตั้งโปรไฟล์การแจกจ่ายในเครื่องฉันจึงไม่สามารถตรวจสอบได้
Guy Ephraim

คำตอบ:


144

อาจเกี่ยวข้องกับหมายเหตุทางเทคนิคนี้https://developer.apple.com/library/content/qa/qa1490/_index.html

สิ่งสำคัญ: สำหรับแอปพลิเคชัน 64 บิตและ iPhone OS มีบั๊กตัวเชื่อมต่อที่ป้องกันไม่ให้ -ObjC โหลดไฟล์อ็อบเจ็กต์จากไลบรารีแบบคงที่ซึ่งมีเฉพาะหมวดหมู่และไม่มีคลาส วิธีแก้ปัญหาคือใช้แฟล็ก -all_load หรือ -force_load -all_load บังคับให้ตัวเชื่อมโยงโหลดไฟล์อ็อบเจ็กต์ทั้งหมดจากที่เก็บถาวรทุกไฟล์ที่เห็นแม้กระทั่งไฟล์ที่ไม่มีรหัส Objective-C -force_load มีอยู่ใน Xcode 3.2 และใหม่กว่า ช่วยให้สามารถควบคุมการโหลดไฟล์เก็บถาวรได้ละเอียดขึ้น อ็อพชัน -force_load แต่ละตัวต้องตามด้วยพา ธ ไปยังไฟล์เก็บถาวรและไฟล์อ็อบเจ็กต์ทุกไฟล์ในไฟล์เก็บถาวรนั้นจะถูกโหลด


3
ใช่สิ่งนี้มีผลกับไลบรารีแบบคงที่สำหรับ iPhone เป็นหลัก หากคอมไพล์โดยไม่มีแฟล็กตัวเชื่อมนี้หมวดหมู่จะไม่รวมอยู่ในไบนารีที่สร้างขึ้นและแอปพลิเคชันใด ๆ ที่ใช้ไลบรารีแบบคงที่เหล่านี้จะมีข้อผิดพลาดรันไทม์เมื่อเรียกใช้งานบนฮาร์ดแวร์ iPhone OS
Brad Larson

1
ไม่ควรมีคำเตือนหรือข้อผิดพลาดของวิธีการที่ขาดหายไปในเวลารวบรวมหรือไม่?
Guy Ephraim

18
ไม่เนื่องจากหมวดหมู่มีอยู่ในเวลาคอมไพล์จึงไม่ได้เชื่อมโยงกับไบนารีสุดท้าย แต่เนื่องจากลักษณะไดนามิกของการจัดส่ง Obj-C ตัวเชื่อมโยงไม่ได้ชี้รหัสการเรียกไปยังวิธีการนำไปใช้โดยตรงดังนั้นจึงไม่สังเกตเห็นว่าไม่มี จากนั้นเมื่อรันไทม์คุณจะได้รับคาบูมแบบเดียวกับที่คุณเรียกโดยใช้ "-performSelector:"
Sophistifunk

14
เพียงแค่ต้องการชี้แจงหมายเหตุทางเทคนิค: โดยส่วนใหญ่คุณจะต้องการแฟล็กตัวเชื่อม -ObjC ไม่ใช่ -all_load แนะนำให้ใช้ -all_load ในอินสแตนซ์ (ฉันถือว่าหายาก) ที่คุณมีไลบรารีที่ไม่มีคลาสมีเพียงหมวดหมู่
Chris Hill

3
ตามstackoverflow.com/a/2615407/62สิ่งนี้ได้รับการแก้ไขเมื่อ XCode 4.2 ดังนั้นคุณจึงไม่จำเป็นต้องใช้แฟล็ก -all_load หรือ -force_load อีกต่อไป คุณยังต้องการ -ObjC
Liron Yahdav
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.