แอป iOS ที่มีกรอบงานขัดข้องบนอุปกรณ์, dyld: ไม่ได้โหลดไลบรารี, Xcode 6 Beta


573

ความผิดพลาดนี้เป็นปัญหาการบล็อกฉันใช้ขั้นตอนต่อไปนี้เพื่อทำให้เกิดปัญหาซ้ำ:

  • สร้างโครงการ Cocoa Touch Framework
  • เพิ่มไฟล์ swift และDog class
  • สร้างกรอบสำหรับอุปกรณ์
  • สร้างแอปพลิเคชั่น Single View ใน Swift
  • นำเข้าเฟรมเวิร์กในโครงการแอพ
  • ยกตัวอย่างคลาส swift จากเฟรมเวิร์กใน ViewController
  • สร้างและเรียกใช้แอปบนอุปกรณ์

แอพหยุดทำงานทันทีที่เปิดตัวนี่คือบันทึกของคอนโซล:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found

ฉันพยายามสร้างบน iOS 7.1 และอุปกรณ์ 8.0 ทั้งคู่มีปัญหาเดียวกัน อย่างไรก็ตามฉันสามารถสร้างแอพและใช้งานเครื่องมือจำลองได้ดี นอกจากนี้ผมทราบว่าผมสามารถเปลี่ยนกรอบในรูปแบบต้องใช้เพื่อเป็นตัวเลือกในการเชื่อมโยงกับไบนารีห้องสมุดแต่มันก็ไม่ได้สมบูรณ์แก้ปัญหาแอปชนเมื่อฉันสร้างตัวอย่างของสุนัข ลักษณะการทำงานแตกต่างกันในอุปกรณ์และตัวจำลองฉันสงสัยว่าเราไม่สามารถแจกจ่ายเฟรมเวิร์กสำหรับอุปกรณ์ที่ใช้ Xcode รุ่นเบต้าได้ ใครสามารถทำให้กระจ่างเกี่ยวกับเรื่องนี้?


1
สิ่งที่ฉันไม่เข้าใจคือสาเหตุที่เฟรมเวิร์กของบุคคลที่สามอื่น ๆ ทำงานนอกกรอบและสามารถลากและวางลงได้อย่างง่ายดายLink Binary with Librariesและ Xcode จะรู้วิธีคัดลอกลงในชุดแอปของคุณในขณะที่เฟรมเวิร์กที่กำหนดเอง
fatuhoku

คำตอบของ sazzad hissain khan ที่นี่stackoverflow.com/questions/26024100/…เป็นคำตอบที่ดีที่สุด ..
Ankit Kumar

1
ลองดูstackoverflow.com/a/52129141/2020034นี้ ใช้งานได้
Vinayak Parmar

คุณสามารถสร้างห้องสมุดที่มีไขมันได้คุณสามารถดูลิงก์นี้: stackoverflow.com/a/54977145/3992606
mohsen

รุ่น Xcode ไม่ตรง , แก้ไขได้ด้วยstackoverflow.com/a/55738882/5443510
จิมมี่หยิน

คำตอบ:


975

ในแท็บทั่วไปของเป้าหมายจะมีฟิลด์ไบนารีแบบฝัง เมื่อคุณเพิ่มเฟรมเวิร์กจะมีการแก้ไขข้อผิดพลาด

การอ้างอิงอยู่ที่นี่บน Apple Developer Forums


73
ฉันมีเฟรมเวิร์กใน Embedded Binaries และฉันได้ตั้ง Copy Copy ไว้เป็น "Frameworks" มันขัดข้อง
loretoparisi

11
วิธีนี้แก้ไขได้เฉพาะในโหมดแก้ไขข้อบกพร่อง ข้อผิดพลาดจะเกิดขึ้นอีกครั้งเมื่อคุณเก็บถาวรหรือสร้างโครงการ
Saad Ur Rehman

13
การเพิ่ม @ executable_path / Frameworks ไปที่ 'Runpath Search Path' แก้ไขปัญหานี้เช่นการเพิ่มเฟรมเวิร์กใน 'Embedded Binaries'
ArdenDev

14
ทุกคนสามารถช่วยเพิ่มเฟรมเวิร์กใน Embedded Binaries จาก POD ได้อย่างไร
Bonnke

3
เหมือนกัน ที่ฉันยังต้องการที่จะทราบวิธีที่จะเพิ่มจากฝักได้รับไม่มี "ทั่วไป> ไบนารีฝังตัว" ที่จะพบใน XCode 6.4 โดยใช้ฝัก
ded

259

สำหรับ iOS ที่มากกว่าหรือเท่ากับ 8

ภายใต้แท็บทั่วไปของเป้าหมายในส่วนไบนารีแบบฝังจะเพิ่มกรอบงาน สิ่งนี้จะคัดลอกเฟรมเวิร์กลงในคอมไพล์เพื่อให้สามารถเชื่อมโยงกับตอนรันไทม์

ป้อนคำอธิบายรูปภาพที่นี่

ทำไมสิ่งนี้จึงเกิดขึ้น :เนื่องจากเฟรมเวิร์กที่คุณกำลังลิงก์ไปนั้นถูกรวบรวมเป็นเฟรมเวิร์กที่ลิงก์แบบไดนามิกดังนั้นจึงถูกลิงก์ไปที่รันไทม์

** หมายเหตุ: ** การฝังเฟรมเวิร์กแบบกำหนดเองได้รับการสนับสนุนใน iOS> 8 เท่านั้นดังนั้นจึงเป็นทางเลือกอื่น ๆ ที่ทำงานบน iOS เวอร์ชันเก่าดังนี้

สำหรับ iOS ที่น้อยกว่า 8

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

** วิธี: ** ภายใต้แท็บการตั้งค่าการสร้างเฟรมเวิร์กในส่วนการเชื่อมโยงให้เปลี่ยนMach-O Typeเป็น Static Library ตอนนี้คุณไม่จำเป็นต้องรวมเฟรมเวิร์กภายใต้ไบนารีแบบฝัง

กรอบคงที่

การรวมสินทรัพย์:หากต้องการรวมสิ่งต่าง ๆ เช่นรูปภาพเสียงหรือไฟล์ xib / nib ฉันขอแนะนำให้สร้างกลุ่ม (โดยพื้นฐานคือไดเรกทอรีให้ดู bit.ly/ios_bundle เพิ่มเติมที่นี่) จากนั้นโหลดเนื้อหาจากชุดข้อมูลโดยใช้ NSBundle


1
ฉันจะเพิ่มเฟรมเวิร์กในไบนารีที่ฝังตัวได้อย่างไรถ้าเฟรมเวิร์กอยู่ใน Pods
TomazStoiljkovic

คุณหมายถึงอะไรโดย "framework อยู่ใน Pods" เฟรมเวิร์กแบบกำหนดเองของคุณถูกแจกจ่ายผ่าน CocoaPods หรือไม่
ดอว์สัน

2
นี่ควรเป็น "มากกว่าหรือเท่ากับ 8" ฉันต้องทำสิ่งนี้บน iOS 8 เช่นกัน
Cruinh

ข้อผิดพลาดSwift is not supported for static libraries
jose920405

@TomazStoiljkovic คุณเข้าใจเรื่องนี้หรือไม่? ฉันมีปัญหาเดียวกันฉันมีกรอบที่ฉันต้องการสร้างเป็นไบนารี แต่ขึ้นอยู่กับกรอบอื่น ๆ ผ่านฝักโกโก้
MegaManX

125

เพียงแค่ลากเฟรมเวิร์กในโครงการของคุณจะไม่ดีพอ มันเหมือนกับอยู่ใน ballpark เดียวกัน แต่ไม่สามารถหาลูกของคุณได้ ทำตามขั้นตอนเหล่านี้:

1)สร้างกรอบงานของคุณ

  • พัฒนากรอบของคุณ
  • เมื่อการพัฒนาของคุณเสร็จสมบูรณ์COMMAND+ Bสร้างกรอบงานของคุณและให้แน่ใจว่าคุณได้รับ "สร้างความสำเร็จ"

ป้อนคำอธิบายรูปภาพที่นี่

2)เข้าถึงกรอบงานของคุณ

  • เมื่อโครงการเฟรมเวิร์กของคุณสร้างสำเร็จสำเร็จจะพร้อมให้คุณเข้าถึงในProductsโฟลเดอร์ในโครงการของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

  • คลิกขวาที่.frameworkและเลือก "แสดงใน Finder"

ป้อนคำอธิบายรูปภาพที่นี่

3) วางกรอบในโครงการของคุณ

  • ลากและวาง.frameworkจากหน้าต่าง Finder ของคุณไปยังโฟลเดอร์ "Framework" ของโครงการแอป

ป้อนคำอธิบายรูปภาพที่นี่

4)กำหนดค่าโครงการแอพสำหรับกรอบงาน

  • เลือกระดับสูงสุดในโครงการของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

  • เลือกเป้าหมายของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

  • ไปที่ "ขั้นตอนการสร้าง" แล้ว "การเชื่อมโยงกับไบนารีห้องสมุด" และมั่นใจว่ากรอบการทำงานของคุณจะรวมกับที่เลือกตัวเลือก

ป้อนคำอธิบายรูปภาพที่นี่

  • ยังอยู่ใน "Build Phases" ไปที่ด้านซ้ายบนและเลือก+ปุ่ม ในเมนูแบบเลื่อนลงเลือก "สร้างสำเนาไฟล์ใหม่"

ป้อนคำอธิบายรูปภาพที่นี่

  • เลื่อนลงไปที่ส่วน "คัดลอกไฟล์" ใหม่และตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าDestinationเป็น "กรอบงาน" เว้นพา ธ ย่อยว่างไว้ จากนั้นคลิก+ปุ่มที่ด้านล่างซ้าย

ป้อนคำอธิบายรูปภาพที่นี่

  • คุณจะได้รับการนำเสนอพร้อมลำดับชั้นโครงการของคุณ เลื่อนลงไปที่โฟลเดอร์ "Frameworks" ที่คุณเพิ่มเฟรมเวิร์กไว้ในขั้นตอนที่ 3 หรือค้นหาในแถบค้นหาที่ด้านบน เลือกกรอบงานของคุณแล้วคลิก "เพิ่ม"

ป้อนคำอธิบายรูปภาพที่นี่

  • ตรวจสอบให้แน่ใจว่ากรอบงานของคุณรวมอยู่ใน "คัดลอกรหัสการลงชื่อ"

ป้อนคำอธิบายรูปภาพที่นี่

5)ล้างแล้วเรียกใช้โครงการของคุณ

  • COMMAND+ SHIFT+K
  • COMMAND+R

5
จุดดี. มันเกือบจะได้ผลสำหรับฉัน ฉันทำกรอบ A ซึ่งรวม Alamofire แอปโฮสต์ของฉัน (เฟรมเวิร์กแบบฝังตัว A) ทำงานในเครื่องจำลอง แต่เมื่อฉันพยายามเรียกใช้ใน iPhone จริงมันเกิดข้อผิดพลาด: Alamofire: dyld: ไม่ได้โหลดไลบรารี: @ rpath / Alamofire.framework / Alamofire เหตุผล: ไม่พบรูปภาพที่เหมาะสม พบว่า: xxx / ddcdemo.app / Frameworks / iddc.framework / Frameworks / Alamofire.framework / Alamofire: mach-o แต่สถาปัตยกรรมผิด
DàChún

1
@Brandon การทำทางเลือกสำหรับเฟรมเวิร์กแก้ไขปัญหาของฉัน แต่คุณช่วยอธิบายฉันหน่อยได้ไหมว่าพฤติกรรมของการทำเฟรมเวิร์กเป็นตัวเลือก?
Mitesh Dobareeya

2
ขอบคุณ! ในขั้นตอนที่ 5 ของคุณฉันได้เลือก "คัดลอกเมื่อติดตั้ง" และนั่นเป็นปัญหาของฉัน
Andi

48

ฉันสร้างเฟรมเวิร์กโดยใช้ Swift3 / Xcode 8.1 และกินมันในโครงการ Objective-C / Xcode 8.1 เพื่อแก้ไขปัญหานี้ผมต้องเปิดการใช้งานภายใต้ตัวเลือกAlways Embed Swift Standard LibrariesBuild Options

ดูภาพหน้าจอนี้:

ป้อนคำอธิบายรูปภาพที่นี่


3
ตอนนี้ทำงานให้ฉันที่เวลา วิธีแก้ปัญหานี้คือไปที่ BuildPhases -> Copy Files -> เลือก Framework ภายใต้ Destination และเพิ่ม framework ของคุณ โอกาสที่ห้องสมุดของคุณหายไปจากที่นี่
Harish

@ แฮริชทางออกที่คุณแนะนำนั้นถูกแนะนำโดยหลาย ๆ คนและแน่นอนว่าฉันจะดูแลมันตั้งแต่แรก ในกรณีของฉันมีการเพิ่มเฟรมเวิร์ก แต่ยังคงมีปัญหาเดียวกันปรากฏอยู่ จากนั้นฉันก็ขุดมันเอง หากคุณลงคะแนนให้กับโซลูชันนี้ฉันไม่ทราบว่าทำไมคุณถึงค่อนข้างมั่นใจเกี่ยวกับวิธีการของคุณเมื่อมันไม่ทำงานในกรณีของฉัน: S
NeverHopeless

@Harish ขอบคุณ คำตอบของคุณช่วยฉันมากขึ้นและแน่นอนว่า NeverHopeless ทำเช่นนั้นด้วย :) ขอบคุณพวกคุณ
Mohsin Khubaib Ahmed

นี่เป็นสิ่งเดียวที่เหมาะกับฉัน .. แต่ฉันก็ "ฝัง" กรอบในEmbedded Binariesส่วนเป้าหมายของฉัน เหตุใดจึงใช้งานได้
guptron

ดีมากสิ่งนี้ใช้ได้เพราะถ้าใช้ไลบรารีที่รวดเร็วหรือพ็อดเพื่อฝังในโครงการ C วัตถุประสงค์ วัตถุประสงค์ของโครงการ C มักจะมีการตั้งค่าสถานะนี้เป็นหมายเลข
Swaroop S

47

ประการแรกลองสร้างหลังจาก Command + Option + Shift + K หากยังไม่สำเร็จให้ทำตามขั้นตอนด้านล่าง

หากใครก็ตามพบข้อผิดพลาดนี้ใน Xcode 8 ให้เปลี่ยนสถานะเฟรมเวิร์กเป็นตัวเลือกแทนต้องการในแท็บทั่วไปของเป้าหมายของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


3
สิ่งนี้จะทำให้ runtime ไม่รู้จักคลาสจากเฟรมเวิร์ก
เทสลา

@azimov ถูกต้อง ฉันกำลังเผชิญภาวะที่กลืนไม่เข้าคายไม่ออกนี้ในขณะนี้ สิ่งที่ต้องทำทำให้เกิดข้อผิดพลาด "ไม่พบภาพ" และหากเราลองตั้งค่าเป็นทางเลือกจะทำให้เกิดข้อผิดพลาดในขณะทำงานด้วย "ตัวเลือกที่ไม่รู้จัก"
Adam Mendoza

1
แม้ว่ากรอบงานของฉันอยู่ใน Link Binaries และฝังแล้วฉันยังคงต้องเพิ่มระยะการคัดลอก dyld: ไม่ได้โหลดไลบรารี: @ rpath / AFNetworking.framework / AFNetworking อ้างอิงจาก: / ผู้ใช้ / {ผู้ใช้} / Library / นักพัฒนา / CoreSimulator / อุปกรณ์ / 6833A85C-5783-45FA-A4D5-991D286B28C2 / data / Containers / Bundle / Application / B1A0A3B2-92A2-41B0-9884-6DB6995A0D7E / MyApp.app / MyApp เหตุผล: ไม่พบภาพ (lldb) โซลูชัน: โครงการ -> เป้าหมาย -> สร้างเฟส -> + ที่ด้านบนเพื่อเพิ่มเฟสใหม่คัดลอกไฟล์ปลายทาง = กรอบงาน ต้องคัดลอก
Adam Mendoza

@AdamMendoza ฉันได้ปฏิเสธแอปของฉันเนื่องจากการทำเช่นนั้น
jbouaziz

@jbouaziz ใช่ข้อผิดพลาดที่คุณอาจพบคือเนื่องจาก. เฟรมเป็นไขมันซึ่งหมายความว่ามีสถาปัตยกรรมที่ไม่รองรับ iOS เช่น i386 x86_64 นอกเหนือจาก armv7 arm64 ที่จำเป็น ร้านค้าจะให้ข้อผิดพลาด แต่คุณอาจไม่เห็นข้อผิดพลาดใน Xcode ใช้ตัวโหลดภายใต้ Xcode -> Open Developer Tool -> Application Loader SolutionL ทำให้บางดู -> ikennd.ac/blog/2015/02/…
Adam Mendoza

28

ฉันมีปัญหาแบบเดียวกันใน iOS เวอร์ชัน 9.x

ปัญหาคือ:แอปขัดข้องทันทีที่ฉันเปิดแอปโดยมีข้อผิดพลาดด้านล่าง

dyld: ไลบรารีไม่ถูกโหลด: /System/Library/Frameworks/UserNotifications.framework/UserNotifications อ้างอิงจาก: /var/containers/Bundle/Application/######/TestApp.app/TestApp สาเหตุ: ไม่พบรูปภาพ

ฉันได้รับการแก้ไขปัญหานี้โดยการเปลี่ยนRequiredไปOptionalในLinked Frameworks and LibrariesสำหรับUserNotifications.frameworkกรอบ


วิธีนี้ใช้ได้ผล ไม่มีใครรู้ว่าทำไม เพราะอุปกรณ์บางอย่างต้องการการตั้งค่านี้ที่คนอื่นทำไม่ได้
NEO

ฉันได้รับ "คำเตือน: ไม่สามารถเรียกใช้รหัสสนับสนุนเพื่ออ่านข้อมูลคลาส Objective-C ในกระบวนการซึ่งอาจลดคุณภาพของข้อมูลประเภทที่มี" เมื่อทำเครื่องหมาย lib ของฉันเป็นตัวเลือก
BergP

มันอาจจะทำงานได้ด้วยเหตุผลว่าทำไมเฟรมเวิร์กบางตัวไม่ทำงานในโปรแกรมจำลองนั่นคือเหตุผลว่าทำไม
Gowtham Sooryaraj

@ redent84 คำตอบนี้พร้อมกับความคิดเห็นของคุณช่วยให้ฉันรอดจากการเป็นบ้า ตรวจสอบปัญหานี้ด้วย AuthenticationServices.framework ซึ่งต้องใช้ iOS 12
Tamás Sengel

26

ฉันต้อง (ด้านบนของสิ่งที่กล่าวถึงที่นี่) เพิ่มบรรทัดต่อไปนี้เพื่อเส้นทางการค้นหา Runpathภายใต้แท็บการตั้งค่าการสร้าง :
@executable_path/Frameworks

ป้อนคำอธิบายรูปภาพที่นี่


ปัญหานี้ได้รับการแก้ไขสำหรับฉัน ฉันเริ่มมีปัญหาหลังจากเพิ่มส่วนขยายแอพลงในแอพ iOS 9 ของฉัน ก่อนที่จะเพิ่มส่วนขยายกรอบงานของฉันก็ใช้ได้ การเพิ่มเฟสสร้างไฟล์คัดลอกไม่ได้ช่วยอะไรและฉันก็ฝังกรอบแล้ว
เกร็ก

มันแปลกมากที่ไม่รวมค่าเริ่มต้น หากคุณคลายซิปและดู IPA ของคุณคุณควรค้นหาเฟรมเวิร์กของคุณใน Payloads / appname.app / Frameworks / อย่างไรก็ตามการเพิ่มพา ธ การค้นหานี้จะต้องมีเพื่อให้แอปค้นหาในโฟลเดอร์นี้ในระหว่างรันไทม์ แปลก.
mattv123

25

คุณต้องเพิ่มเฟรมเวิร์กลงใน Copy Files Build Phase ใหม่เพื่อให้แน่ใจว่าเฟรมเวิร์กถูกคัดลอกไปยังบันเดิลของแอ็พพลิเคชันเมื่อรันไทม์

ดูวิธีเพิ่ม 'คัดลอกไฟล์สร้างเฟส' ในเป้าหมายของฉันสำหรับข้อมูลเพิ่มเติม

เอกสารอย่างเป็นทางการของ Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html


หลังจากลองหลายสิ่งหลายอย่างนี่คือสิ่งที่แก้ไขได้สำหรับฉัน ฉันมีกรอบใน Link Binary และ Embed Framework แล้ว ฉันไม่คิดว่าฉันจะต้องเพิ่มขั้นตอนการคัดลอกด้วย
Adam Mendoza

14

หากคุณใช้Xcode 11 หรือใหม่กว่า :

  1. ไปที่การตั้งค่าเป้าหมายและเลือกของคุณทั่วไป

การตั้งค่าเป้าหมาย / ทั่วไป

  1. เลื่อนลงไปที่กรอบ, ห้องสมุดและเนื้อหาที่ฝัง

  2. ตรวจสอบให้แน่ใจว่าได้เลือกค่าการฝัง & เซ็นหรือการฝังโดยไม่ต้องลงนามสำหรับตัวเลือกการฝังหากจำเป็น

เฟรมเวิร์กไลบรารีและเนื้อหาที่ฝัง



11

น่าแปลกที่ชิ้นส่วนที่จำเป็นไม่ทั้งหมดถูกบันทึกไว้ที่นี่อย่างน้อยสำหรับ Xcode 8

เคสของฉันเป็นเฟรมเวิร์กที่สร้างขึ้นเองซึ่งเป็นส่วนหนึ่งของเวิร์กสเปซเดียวกัน ปรากฎว่ามันถูกสร้างขึ้นอย่างไม่ถูกต้อง ตามการตอบกลับล่าสุดของ jeremyhu ต่อกระทู้นี้:

https://forums.developer.apple.com/thread/4687

ผมมีชุดDynamic Library Install Name Base( DYLIB_INSTALL_NAME_BASE) ภายใต้Build Settingsของกรอบโครงการแล้วสร้างมัน มันตั้งไม่ถูกต้องและฉันได้เปลี่ยนไป$(LOCAL_LIBRARY_DIR)@rpath

ดังนั้นในขั้นตอนการประมวลผลลิงก์ในโครงการแอพมันสั่งให้แอพโฮสต์ทำการโหลดเฟรมเวิร์กที่รันไทม์จาก/Library/Frameworks/fw.Framework/fw(เช่นในรูทของระบบไฟล์รันไทม์) แทนที่จะเป็นพา ธ ไปยังแอป/Frameworks/fw.Framework/fw

เกี่ยวกับการตั้งค่าอื่น ๆ ทั้งหมด: มันจะต้องมี 3 ตำแหน่งBuild Phasesแต่สิ่งเหล่านี้จะถูกตั้งค่าทั้งหมดในครั้งเดียวเมื่อคุณเพิ่งเพิ่มเข้าไปในEmbedded Binariesการตั้งค่าGeneralแท็บของแอพโฮสติ้ง

ฉันไม่จำเป็นต้องตั้งCopy Filesระยะพิเศษซึ่งดูเหมือนว่าจะซ้ำซ้อนอย่างสังหรณ์ใจเมื่อเทียบกับขั้นตอนการฝังอย่างไรก็ตาม ด้วยการตรวจสอบปลายหางของหลักฐานการสร้างเราสามารถรับรองได้ว่าไม่จำเป็น

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[ลบบรรทัด verbose จำนวนมาก แต่ชัดเจนจากการถอดเสียงแบบง่ายใน Xcode UI]

ฉันยังคงมีไม่มีความคิดว่าทำไม Xcode ตั้งDYLIB_INSTALL_NAME_BASEค่าไม่ถูกต้องกับฉัน


1
ขอบคุณนี่กลายเป็นปัญหาของฉันใน Xcode 11 ฉันกำลังนำเข้าหนึ่งในเฟรมเวิร์กของตัวเองซึ่งใช้งานได้ก่อนหน้านี้ แต่เริ่มออกข้อผิดพลาด "dyld: Library not load" คุณต้องการตั้งค่าการสร้าง "Dynamic Library Install Name Base" เป็น "@rpath" ในโครงการของเฟรมเวิร์กที่คุณกำลังพยายามนำเข้าไม่ใช่ในโครงการที่คุณกำลังนำเข้า ยังไงก็เถอะมันถูกตั้งค่าเป็น "/ Library / Frameworks"
Ben Stahl

ดีใจที่เป็นประโยชน์ 3 ปีต่อมา แก้ไขตามนั้น
BaseZen

9

ในกรณีของฉันการแก้ปัญหาคือการลบเฟรมเวิร์กที่คอมไพล์จาก Embedded Binaries ซึ่งเป็นโครงการแบบสแตนด์อโลนในเวิร์กสเปซทำความสะอาดและสร้างใหม่


8

สภาพแวดล้อมของฉัน: Cocos2d 2.0, Box2d, Objective C

นอกจากทำตามคำตอบอื่น ๆ ข้างต้นแล้วในที่สุดฉันก็ไปที่แท็บทั่วไปและทำ WatchKit เป็นตัวเลือก

เป้าหมายทั่วไปที่เชื่อมโยงกรอบและไลบรารี Watchkit.framework


8

หากคุณใช้เฟรมเวิร์กของบุคคลที่สามและใช้ Cocoapods เป็นผู้จัดการการพึ่งพาของคุณให้ลองทำ a pod installเพื่อรีเฟรชพ็อด

ความผิดพลาดนี้เกิดขึ้นในห้องสมุดบุคคลที่สามที่ฉันใช้อยู่ดีใจที่โซลูชันด้านบนใช้งานได้สำหรับฉันหวังว่าจะได้ผลสำหรับคุณ!


1
ที่ดี! แก้ไขปัญหาของฉัน แต่มีวิธีหลีกเลี่ยงการติดตั้งการพึ่งพา pod ในแอพโฮสต์ของฉันหรือไม่
DàChún

8

ป้อนคำอธิบายรูปภาพที่นี่

แก้ปัญหาให้ฉันโดยยกเลิกการเลือก "คัดลอกเมื่อติดตั้งแล้ว" ใน Build Phases-> Embed Frameworks


1
จะเป็นการดีหากได้ทราบจุดของช่องทำเครื่องหมายนี้หากระบบไม่เชื่อว่า "debug ติดตั้ง" ไม่ใช่ "ติดตั้ง" โดยไม่คำนึงถึงถ้ามันทำให้แอพของฮาร์ดแวร์ผิดพลาดแทนที่จะห้ามการรันแอพโดยมีคำเตือนมันเป็นข้อบกพร่อง Xcode ที่เรียบร้อยอีกอย่างหนึ่ง
William Cerniuk

8

มันเป็นข้อผิดพลาดรันไทม์ที่เกิดจาก Dynamic Linker

dyld: Library not loaded: @rpath/...
...
Reason: image not found

ข้อผิดพลาดLibrary not loadedกับตัว@rpathบ่งชี้ที่Dynamic Linkerไม่สามารถหาไบนารี

  1. ตรวจสอบว่ามีการเพิ่มเฟรมเวิร์กไดนามิกหรือไม่ General -> Embedded Binaries

  2. ตรวจสอบการ@rpathตั้งค่าระหว่าง consumer (application) และ producer (dynamic framework):

    • กรอบแบบไดนามิก:
      • Build Settings -> Dynamic Library Install Name
    • การประยุกต์ใช้:
      • Build Settings -> Runpath Search Paths
      • Build Phases -> Embed Frameworks -> Destination, Subpath

ตัวเชื่อมโยงแบบไดนามิก

Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)ซึ่งใช้โดยloadable bundle( Dynamic frameworkเป็นอนุพันธ์) ที่dyldเข้ามาเล่น
Dynamic Library Install Name- เส้นทางไปยังไฟล์ไบนารี (ไม่ใช่. framework) ใช่พวกเขามีชื่อเดียวกัน แต่MyFramework.frameworkเป็นpackaged bundleกับMyFrameworkไฟล์ไบนารีและทรัพยากรภายใน
เส้นทางไปยังไดเรกทอรีนี้สามารถแน่นอนหรือญาติ (เช่น@executable_path, @loader_path, @rpath) เส้นทางสัมพัทธ์จะดีกว่าเนื่องจากมีการเปลี่ยนแปลงพร้อมกับจุดยึดที่มีประโยชน์เมื่อคุณกระจายบันเดิลของคุณเป็นไดเรกทอรีเดียว

เส้นทางที่แน่นอน - ตัวอย่างFramework1

//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1

@executable_path

@executable_path - สัมพันธ์กับรายการไบนารี - ตัวอย่างการ ใช้Framework2ตัวอย่าง
: ฝัง a Dynamic frameworkลงในแอปพลิเคชัน

//Application bundle(`.app` package) absolute path
/some_path/Application.аpp

//Application binary absolute path 
/some_path/Application.аpp/subfolder1

//Framework2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

//Framework2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework2 Dynamic Library Install Name 
@executable_path/../Frameworks/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
/some_path/Application.аpp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

@loader_path

@loader_path - สัมพันธ์กับบันเดิลซึ่งเป็นเจ้าของ
กรณีการใช้งานไบนารีนี้: เฟรมเวิร์กที่ฝังเฟรมเวิร์ก - Framework3_1 กับ Framework3_2ภายใน

//Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1

//Framework3_2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1

//Framework3_1 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework3_1 @loader_path == Framework3_1 @executable_path
/some_path/Application.аpp/subfolder1

//Framework3_2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework3_2 @loader_path == Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1

//Framework3_2 Dynamic Library Install Name 
@loader_path/../Frameworks/Framework3_2.framework/subfolder1

//Framework3_2 binary resolved absolute path by dyld
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1

@rpath - เส้นทางการค้นหา Runpath

ตัวอย่างFramework2

ก่อนหน้านี้เราต้องตั้งค่า Framework ให้ทำงานกับ dyld ไม่สะดวกเนื่องจาก Framework เดียวกันไม่สามารถใช้กับการกำหนดค่าที่แตกต่างกัน

@rpath เป็นแนวคิดแบบผสมที่อาศัยส่วนนอก (แอปพลิเคชัน) และส่วนซ้อน (ไดนามิกเฟรมเวิร์ก):

  • การประยุกต์ใช้:

    • Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)- @rpathกำหนดรายชื่อของแม่ซึ่งถูกแทนที่ด้วย
       @executable_path/../Frameworks
    • ตรวจสอบBuild Phases -> Embed Frameworks -> Destination, Subpathว่าเป็นไชร์ซึ่งเป็นที่ตั้งของกรอบงานฝังอย่างแน่นอน
  • Dynamic Framework:

    • Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)- จุดที่@rpathใช้ร่วมกับเส้นทางมัดท้องถิ่นเพื่อไบนารี
      @rpath/Framework2.framework/subfolder1
//Application Runpath Search Paths
@executable_path/../Frameworks

//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

* * * *../ - ไปที่พาเรนต์ของไดเรกทอรีปัจจุบัน

otool - เครื่องมือแสดงไฟล์วัตถุ

//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2

//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2

//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

LC_RPATH
@executable_path/../Frameworks

//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

install_name_tool เปลี่ยนชื่อการติดตั้งไลบรารีที่แชร์แบบไดนามิกโดยใช้ -rpath

CocoaPodsใช้use_frameworks![เกี่ยวกับ]เพื่อควบคุมDynamic Linker

[คำศัพท์]


6

เมื่อเร็ว ๆ นี้พบปัญหานี้กับการนำเข้า CoreNFC บนไอโฟนเก่า (เช่น iPhone 6) และ Xcode (11.3.1) ฉันสามารถทำให้มันทำงานได้

  1. ในโครงการของคุณเลือกเป้าหมาย
  2. ไปที่ทั่วไปแท็บด้านบน
  3. ภายใต้ ' กรอบ, ไลบรารีและเนื้อหาที่ฝัง ' ให้เพิ่มกรอบงาน (สำหรับฉันมันคือ CoreNFC) ทำซ้ำสำหรับเป้าหมายอื่น
  4. คลิกที่สร้างเฟสด้านบนและขยาย ' ลิงก์ไบนารีกับไลบรารี '
  5. กำหนดกรอบงานที่ยุ่งยากให้เลือก (จากที่จำเป็น)

สิ่งนี้ทำให้ฉันสามารถรวบรวมสำหรับ iPhone เก่า / ใหม่กว่าโดยไม่ต้องทำการเปลี่ยนแปลงรหัสใด ๆ ฉันหวังว่านี่จะช่วยคนอื่นได้


1
ขอบคุณ. การทำให้เป็นตัวเลือกคือลิงก์ที่ขาดหายไป ...
fl034

ใช้งานไม่ได้แอปขัดข้องและไม่มีข้อความระบุประเภทความผิดพลาดแทนจุดพักในแอสเซมบลีรหัสบางรหัส
Newsonic

เหตุใดจึงจำเป็นต้องสร้างทางเลือก
rohitwtbs

5

ฉันมีปัญหาเดียวกัน ฉันพยายามสร้างโครงการด้วย iPhone ที่ฉันไม่เคยใช้มาก่อนและฉันไม่ได้เพิ่มกรอบงานใหม่ สำหรับฉันการทำความสะอาดก็ใช้งานได้ดี ( Shift + Command + K ) อาจเป็นเพราะฉันใช้ beta 5 ของ Xcode 7 และ iPhone 6 กับ iOS 9 Beta แต่ใช้งานได้


และอาจเป็น Clean Build Folder ด้วย (CMD + Shift + Alt + K)
Grifas

4

ในกรณีของฉันโครงการของฉันเขียนขึ้นโดยมีวัตถุประสงค์ -c และในห้องสมุดมีไฟล์ Swift ดังนั้นฉันจึงเปลี่ยน"Always Embed Swift Standard Libraries"ในแท็บBuild Settingsของโครงการเป็นYesและมันก็โอเคโดยสิ้นเชิง


4

สำหรับโปรเจ็กต์หรือโปรเจ็กต์ Framework ใน Xcode ที่ใช้พ็อดวิธีหนึ่งที่ง่ายในการหลีกเลี่ยงไลบรารีแบบไดนามิก (dylb) ที่ไม่โหลดคือการตั้งค่าไฟล์พ็อดให้คุณทำหมึกในโหมดสแตติก หากต้องการทำเช่นนั้นเพียงตรวจสอบให้แน่ใจว่าไม่ได้เขียนบรรทัดต่อไปนี้ในไฟล์พ็อดของคุณ

use_frameworks!

เมื่อลบบรรทัดออกจากไฟล์ที่คุณบันทึกแล้วให้เรียกใช้จากคอนโซล:

$ pod update

2

ถ้ามีฝักพัฒนาลบแอปของคุณออกจากการติดตั้งเครื่องมือจำลองจาก -> ล้าง -> ทำงานอีกครั้ง ...


2

สิ่งเดียวกันคือเมื่อฉันสร้างโครงร่างการกำหนดค่าและการสร้างใหม่

ดังนั้นทางออกสำหรับฉันคือการทำงาน

pod install

สำหรับการกำหนดค่าที่สร้างขึ้นใหม่นี้


1

หลังจากลองใช้วิธีการทั้งหมดที่มีบนอินเทอร์เน็ตและลองผิดลองถูกและลองผิดลองถูก 100 ครั้ง ในที่สุดฉันก็สามารถที่จะแก้ปัญหาได้ - Apeksha Sahu 6 นาทีที่แล้ว
ไปที่ iTunes ใน Mac -> บัญชี -> อนุญาตคอมพิวเตอร์นี้ - Apeksha Sahu 5 นาทีที่ผ่านมา
ขั้นตอนที่สอง .... นักพัฒนาไปสู่การตั้งค่าใน iPad และ iPhone และทำดัชนีใหม่ด้วยตัวระบุ มันใช้งานได้สำหรับฉัน ........ ....... หลังจากติดตั้ง Mac OSHigh seria 10.13.15 เวอร์ชั่นใหม่จาก Mac OS seirra beta เวอร์ชั่นล่าสุดเพื่อติดตั้ง Xcode เวอร์ชันล่าสุดหลังจากอัปเดตใบรับรองทั้งหมด ฯลฯ ฯลฯ ฯลฯ ... เป็นวิธีการมากมายที่คุณสามารถคิดว่าฉันทำ -ป้อนคำอธิบายรูปภาพที่นี่



1

Xcode 11

  1. นำทางไปยังการตั้งค่าเป้าหมายของคุณและเลือกทั่วไป
  2. ค้นหา "Frameworks ไลบรารีและเนื้อหาที่ฝัง"
  3. เก็บ "อย่าฝัง" และตรวจสอบให้แน่ใจว่าเป้าหมายทั้งหมดของคุณ (ถ้าคุณมีมากกว่าหนึ่ง) ได้ตั้งค่าเป็นกรอบงานของตัวเองและไม่ใช่เป้าหมายอื่น ๆ

1

ในXcode 11

ฉันกำลังเผชิญกับปัญหาเดียวกัน

การเปลี่ยน"ไม่ต้องฝัง"ในแท็บทั่วไป > "กรอบงานไลบรารีและเนื้อหาที่ฝัง"ยังคงเป็นข้อผิดพลาดเดียวกัน

สิ่งที่แก้ไขได้สำหรับฉันคือการเพิ่มกรอบงานในแท็บสร้างเฟส > ฝังกรอบงาน

--Updated ---

ฉันสังเกตเห็นว่าในโครงการที่สร้างขึ้นในเวอร์ชันก่อนหน้าของส่วน Xcode Embed Frameworksไม่สามารถใช้ได้เมื่อทำงานใน Xcode 11 ค้นหาขั้นตอนด้านล่างเพื่อให้ได้โซลูชัน:

1: ขั้นแรกจำเป็นต้องเพิ่มเฟสไฟล์คัดลอกใหม่ภายใต้แท็บสร้างเฟส

ป้อนคำอธิบายรูปภาพที่นี่

2: เปลี่ยนชื่อวินาทีของเฟสที่เพิ่มเป็นEmbed Frameworks ป้อนคำอธิบายรูปภาพที่นี่

3: เปลี่ยนปลายทางเพื่อกรอบ

ป้อนคำอธิบายรูปภาพที่นี่

4: เพิ่มกรอบงานที่เกิดข้อผิดพลาด

ป้อนคำอธิบายรูปภาพที่นี่


1

แม้ว่าทุกคนกำลังพูดถึงการฝังเฟรมเวิร์กภายใต้ Embedded Binaries แต่ก็ยังไม่สามารถใช้งานได้เพราะเราพลาดขั้นตอนสำคัญไปหนึ่งขั้นตอน

นี่คือสองขั้นตอนที่ถูกต้องในการเพิ่มไบนารีภายใต้แท็บไบนารีแบบฝัง:

  1. ลบกรอบงานที่ทำให้เกิดข้อผิดพลาดจาก "Linked Frameworks and Libraries" ในแท็บ General

  2. ตอนนี้เพิ่มเฟรมเวิร์กที่ถูกลบออกภายใต้แท็บ Embedded ไบนารีเท่านั้นและนั่นคือทั้งหมดที่ต้องทำ

เรียกใช้บนอุปกรณ์และเก็บรอยยิ้มนั้นไว้;)


0
  1. ไปที่ไฟล์ใน xcode -> การตั้งค่าพื้นที่ทำงาน
  2. คลิกลูกศรที่อยู่ถัดจากที่ปรากฏขึ้น / Users / apple / Library / Developer / Xcode / DerivedData
  3. เลือกข้อมูลที่ได้รับและย้ายไปที่ถังขยะ
  4. ค่อนข้าง xcode แล้วเปิดใหม่
  5. ทำความสะอาดโครงการและเรียกใช้อีกครั้ง

ขั้นตอนข้างต้นแก้ไขการออกของฉัน


-5

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

https://developer.apple.com/library/ios/qa/qa1886/_index.html


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