によって引き起こされる実行時エラーです 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
ここで、誘導体として)を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例
ユースケース:埋め込み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_2が内部にある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-ランパス検索パス
Framework2の例
以前は、dyldで動作するようにフレームワークをセットアップする必要がありました。同じフレームワークを異なる構成で使用することはできないため、不便です
@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
Xcodeがそれらをアプリバンドルにコピーすることを知っているのに対し、カスタムフレームワークの場合、これは単に発生しません。