มันเป็นข้อผิดพลาดรันไทม์ที่เกิดจาก 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 จะรู้วิธีคัดลอกลงในชุดแอปของคุณในขณะที่เฟรมเวิร์กที่กำหนดเอง