Neden olduğu bir çalışma zamanı hatasıdır Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
Hata Library not loaded
ile @rpath
gösterir Dynamic Linker
ikili bulamıyorum.
Dinamik çerçevenin eklenip eklenmediğini kontrol edin General -> Embedded Binaries
@rpath
Tüketici (uygulama) ve üretici (dinamik çerçeve) arasındaki kurulumu kontrol edin :
- Dinamik çerçeve:
Build Settings -> Dynamic Library Install Name
- Uygulama:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Dinamik bağlayıcı
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
tarafından kullanılan loadable bundle
( Dynamic framework
burada bir türevi gibi) dyld
devreye girer
Dynamic Library Install Name
ikili dosyasının yolunu (değil .framework) -. Evet, onlar aynı isme sahip olabilir ama MyFramework.framework
bir olduğunu packaged bundle
ile MyFramework
iç ikili dosya ve kaynakların.
Dizinin Bu yol mutlak veya göreceli olabilir (örneğin @executable_path
, @loader_path
, @rpath
). Göreli yol daha çok tercih edilir, çünkü paketinizi tek bir dizin olarak dağıttığınızda yararlı olan bir çapa ile birlikte değişir
mutlak yol - Framework1 örneği
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - giriş ikili dosyasına göre - Framework2 örnek
kullanım örneği: a Dynamic framework
bir uygulamaya gömme
//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 - bu ikili
kullanım örneğinin sahibi olan pakete göre : gömülü çerçeveli çerçeve - içinde Framework3_2 içeren Framework3_1
//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 Arama Yolu
Framework2 örneği
Daha önce dyld ile çalışmak için bir Çerçeve kurmalıydık. Bu uygun değildir, çünkü aynı Çerçeve farklı konfigürasyonlarla kullanılamaz
@rpath
dış (Uygulama) ve iç içe (Dinamik çerçeve) parçalara dayanan bileşik bir kavramdır:
Uygulama:
Dinamik Çerçeve:
//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
* ../
- geçerli dizinin üst dizinine git
otool
- nesne dosyası görüntüleme aracı
//-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
kullanarak dinamik paylaşılan kitaplık yükleme adlarını değiştirme -rpath
CocoaPods
kullanımları use_frameworks!
[Hakkında] bir düzenlemeyeDynamic Linker
[Kelime]
Link Binary with Libraries
ve Xcode bunları bir şekilde uygulama paketinize kopyalamayı biliyor, oysa özel çerçeveler için bu gerçekleşmez.