アプリケーションバンドルから実行時にロードする必要があるdylibがたくさんあります。dylibs を/usr/lib
フォルダーに入れると、アプリケーションがそれをロードできることに気付きました。私はinstall_name_tool
手動で行ってきましたが、アプリケーションにこれらの dylib を.app/contents/Frameworks
フォルダーからロードさせる方法についての手がかりがありません。
誰かがこれで私を助けてくれませんか??
昨日、この同じ問題に対処しました。
直観的でないのは、dylib を XCode のファイル ブラウザーにドラッグし、ビルド フェーズを追加してそれらをバンドルされた実行可能ファイルにコピーするため、リンカーがアプリに「書き込み」、それらの dylib の場所を伝えるため、期待することです。 . 残念ながら、そうではありません。
歴史的または誰が知っている理由が何であれ、XCodeで行うことからこの情報を導出するのではなく、dylib自体内の文字列からこれを導出します。XCode が触れず、コマンドライン ツールを使用して手動で設定する必要があるもの。
各 dylib の中には「id」と呼ばれる文字列があり、これはプログラムが dylib を探すパスです。これは、リンク時に実行可能ファイルにコピーされると思います。この文字列が何であるかを調べるには、次を実行できます。
otool -L pathToMyDylib
コマンドが出力する最初の行は、プログラムの実行時に exec が期待する文字列であり、「id」と呼ばれます。私はいくつかのブースト ライブラリを作成しましたが、それらの ID の出力は単なるファイル名でした。コマンドが出力する後の行は「依存関係」です。これらは、dylib の実行に依存する可能性がある他のライブラリです。多くの場合、私の場合のように、これらはすべての Mac ディストリビューションに存在することが保証されているライブラリであるため、これらを修正する必要はありません。そうでなかったら。それらが自分で構築したライブラリであり、アプリに含める予定である場合は、これらも修正する必要があります。したがって、私の出力otool -L libboost_regex.dylib
は次のとおりです。
libboost_regex.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)
最初の行は、実行可能ファイル内を確認するために修正する必要がある行です。これを修正するのは正しいことですinstall_name_tool
。これを修正するために使用したのは(ブーストdylibと同じディレクトリにある端末を使用):
install_name_tool -id "@executable_path/../Frameworks/libboost_regex.dylib" libboost_regex.dylib
それぞれ、(-id フラグの後の) 最初のパラメーターは新しいパスで、2 番目のパラメーターは変更する dylib ファイルです。
依存関係の 1 つに同様の変更を加える必要がある場合は、次を使用します。
install_name_tool -change oldpath newpath currentfile
そして、これは個別の依存関係ごとに再適用する必要があります。
これが役立つことを願っています!