9

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」プロパティの意味を理解するのに苦労しています。パス名形式の識別子のようです。依存ライブラリ用に変更すると実行時エラーが発生するのはなぜですか? さらなる実験で、これらの質問に対する答えを見つけようとします...

4

2 に答える 2

1

おそらく、コードの静的コンパイルを検討する必要があります。これにより、依存関係がプログラムにより適切にアタッチされます

gccを使用している場合は、追加するだけです-static

于 2010-06-22T11:46:42.290 に答える
0

GStreamer は複雑なシステムであり、多くの依存関係があります。ツールを使用すると、GStreamer が直接必要とする共有ライブラリを見つけることができますが、動的にロードされたライブラリ、構成ファイル、および翻訳データが確実に失われます。

このサイトには、スタンドアロン GStreamer パッケージの作成に関する有用な情報が含まれている可能性があります。これにより、バンドル プロセスが簡素化されます。

于 2010-06-27T22:31:45.517 に答える