यह एक रनटाइम त्रुटि है, जो इसके कारण होता है Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
त्रुटि Library not loaded
के साथ @rpath
इंगित करता है कि Dynamic Linker
द्विआधारी नहीं मिल रहा।
जांचें कि क्या डायनेमिक फ्रेमवर्क को जोड़ा गया था General -> Embedded Binaries
@rpath
उपभोक्ता (एप्लिकेशन) और निर्माता (डायनामिक फ्रेमवर्क) के बीच सेटअप की जाँच करें :
- गतिशील ढांचा:
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
एक व्युत्पन्न के रूप में) किया जाता है, जहां बाइनरी फ़ाइल (नहीं .framework) के लिए dyld
खेल में आते हैं
Dynamic Library Install Name
। हाँ, वे एक ही नाम है, लेकिन MyFramework.framework
एक है packaged bundle
के साथ MyFramework
बाइनरी फ़ाइल और संसाधनों के अंदर।
निर्देशिका में इस पथ पूर्ण या संबंधित हो सकता है (उदाहरण के लिए @executable_path
, @loader_path
, @rpath
)। सापेक्ष पथ अधिक बेहतर होता है क्योंकि यह एक एंकर के साथ बदल दिया जाता है जो तब उपयोगी होता है जब आप अपने बंडल को एकल निर्देशिका के रूप में वितरित करते हैं
पूर्ण पथ - फ्रेमवर्क 1 उदाहरण
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - प्रविष्टि बाइनरी के सापेक्ष - फ्रेमवर्क 2 उदाहरण
उपयोग मामला: 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 - बंडल के सापेक्ष जो इस बाइनरी
उपयोग केस का मालिक है : एम्बेडेड फ्रेमवर्क के साथ फ्रेमवर्क - फ्रेमवर्क 2-3_1 जिसमें फ्रेमवर्क -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
@ रथ - रनपथ खोज पथ
फ्रेमवर्क 2 का उदाहरण
पहले हमें डाइल्ड के साथ काम करने के लिए एक रूपरेखा तैयार करनी थी। यह सुविधाजनक नहीं है क्योंकि एक ही फ्रेमवर्क का उपयोग विभिन्न कॉन्फ़िगरेशन के साथ नहीं किया जा सकता है
@rpath
एक यौगिक अवधारणा है जो बाहरी (अनुप्रयोग) और नेस्टेड (डायनामिक फ्रेमवर्क) भागों पर निर्भर करती है:
//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
और किसी तरह एक्सकोड उन्हें आपके ऐप बंडल में कॉपी करना जानता है, जबकि कस्टम फ्रेमवर्क के लिए यह बस नहीं होता है।