GStreamer ライブラリを使用するアプリケーションを開発しています。展開を容易にするために、すべての GStreamer ライブラリをローカル バンドルにまとめたいと考えています。このために、次のことを行う小さなスクリプトを作成しました。
- 依存関係を再帰的にトラバースする ( を使用
otool -L
) - すべての依存関係をローカル ディレクトリにコピーする
- すべての依存パスを @executable_path に相対的に作成します (を使用
install_name_tool
)
(興味がある場合は、Ruby スクリプトを参照してください。)
gst_init
ただし、呼び出し時にランタイム エラーが表示されるようになりました。
(process:22843): GLib-GObject-CRITICAL **: gtype.c:2458: initialization assertion failed, use g_type_init() prior to this function
(process:22843): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed
これらのエラーは、ローカライズされたライブラリを使用した場合にのみ発生します。
install_name_tool の使用に関して、特定の「よくある落とし穴」はありますか? 誰かが私が間違っている可能性があることを知っていますか? 特定の詳細を知る必要がある場合は、お気軽にお問い合わせください。
更新
いくつか変更しました:
- 依存ライブラリについては、id ではなく dylib パスのみを変更するようになりました (のみを使用
install_name_tool -change
し、 を変更しませんinstall_name_tool -id
)。 - メイン ライブラリの場合、実行可能パス (
@executable_name/components/Video.dylib
) に相対的な id 値を設定します。
これら2つの変更により、機能します。しかし、なぜそれが機能するのかは私にはまだ明らかではありません。「id」プロパティの意味を理解するのに苦労しています。パス名形式の識別子のようです。依存ライブラリ用に変更すると実行時エラーが発生するのはなぜですか? さらなる実験で、これらの質問に対する答えを見つけようとします...