Ini adalah kesalahan runtime yang disebabkan oleh Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
Kesalahan Library not loaded
dengan @rpath
menunjukkan bahwa Dynamic Linker
tidak dapat menemukan biner.
Periksa apakah kerangka dinamis telah ditambahkan General -> Embedded Binaries
Periksa @rpath
pengaturan antara konsumen (aplikasi) dan produsen (kerangka kerja dinamis):
- Kerangka dinamis:
Build Settings -> Dynamic Library Install Name
- Aplikasi:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Tautan dinamis
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
yang digunakan oleh loadable bundle
( Dynamic framework
sebagai turunan) di mana dyld
menjadi play
Dynamic Library Install Name
- path ke file binary (bukan .framework). Ya, mereka memiliki nama yang sama, tetapi MyFramework.framework
adalah packaged bundle
dengan MyFramework
file biner dan sumber daya dalam.
Path ini ke direktori dapat absolut atau relatif (misalnya @executable_path
, @loader_path
, @rpath
). Jalur relatif lebih disukai karena diubah bersama dengan jangkar yang berguna ketika Anda mendistribusikan bundel Anda sebagai direktori tunggal
path absolut - contoh Framework1
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - relatif ke entri biner - Contoh
kasus penggunaan Framework2
: menanamkan Dynamic framework
ke dalam aplikasi
//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 - relatif terhadap bundel yang merupakan pemilik
kasus penggunaan biner ini: framework dengan embedded framework - Framework3_1 dengan Framework3_2 di dalamnya
//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 - Jalur Pencarian Runpath
Contoh framework2
Sebelumnya kami harus menyiapkan Kerangka untuk bekerja dengan dyld. Itu tidak nyaman karena Kerangka yang sama tidak dapat digunakan dengan konfigurasi yang berbeda
@rpath
adalah konsep gabungan yang bergantung pada bagian luar (Aplikasi) dan bersarang (kerangka kerja dinamis):
Aplikasi:
Kerangka Kerja Dinamis:
//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
* ../
- pergi ke induk dari direktori saat ini
otool
- Alat penampil file objek
//-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
ubah nama instal shared library dinamis menggunakan -rpath
CocoaPods
menggunakan use_frameworks!
[Tentang] untuk mengatur aDynamic Linker
[Kosa kata]
Link Binary with Libraries
dan entah bagaimana Xcode tahu untuk menyalinnya ke dalam bundel aplikasi Anda, sedangkan untuk kerangka kerja kustom ini tidak terjadi.