มันเป็นข้อผิดพลาดรันไทม์ที่เกิดจาก Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
ข้อผิดพลาดLibrary not loadedกับตัว@rpathบ่งชี้ที่Dynamic Linkerไม่สามารถหาไบนารี
ตรวจสอบว่ามีการเพิ่มเฟรมเวิร์กไดนามิกหรือไม่ General -> Embedded Binaries
ตรวจสอบการ@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 เป็นแนวคิดแบบผสมที่อาศัยส่วนนอก (แอปพลิเคชัน) และส่วนซ้อน (ไดนามิกเฟรมเวิร์ก):
การประยุกต์ใช้:
Dynamic Framework:
//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
[คำศัพท์]
Link Binary with Librariesและ Xcode จะรู้วิธีคัดลอกลงในชุดแอปของคุณในขณะที่เฟรมเวิร์กที่กำหนดเอง