0

私は GStreamer ユーザー/プログラマーですが、GLib を直接使用したことはありません。最近、単純な GObject を構築するために GLib を使用し、シグナルの実装を利用することにしました。(私は Windows プログラマーです)

GObject の定義と実装を備えた単純な静的ライブラリを開発しました。メインアプリはこのライブラリと静的にリンクし、最初のライブラリにも静的にリンクされた他のライブラリと動的にリンクします。

私が電話したら

DummyObj *dummy = (DummtyObj *) g_object_new(DUMMY_OBJ_TYPE, NULL);

メインアプリからは機能しますが、動的ライブラリ内で同じ関数で DummyObj インスタンスを構築しようとすると失敗し、出力で読み取ることができます

既存の型を登録できません... g_once_init_leave_ assertion 'initialization_value != 0' failed g_object_new: assertion 'G_TYPE_IS_OBJECT (object_tye)' failed

代わりに、DummyObj *dummy = (DummtyObj *) g_object_new(DUMMY_OBJ_TYPE, NULL); を呼び出す最初のライブラリが動的ライブラリである場合。メインアプリがこの関数を呼び出すと、同じエラーで失敗します。

最初のコンテキストのようですか?オブジェクトを初期化するのは、この種のオブジェクトのインスタンスを作成できる唯一のものです。

私はこれについて少し混乱しています。GStreamer では、メイン アプリ、他のプラグイン、動的ライブラリ内で新しいプラグインを作成できますが、これらのエラーは見たことがありません

英語は私の母国語ではなく、この問題を説明するのは簡単ではないと思います。

どうもありがとう

すべてのコンテキストで g_object_new を最初に呼び出すと、TYPE を hash_table に登録しようとするようです。1 つ目は TYPE を登録できますが、2 つ目は常に同じエラーで失敗します。コードを見ると、2 番目の呼び出しが型を再度登録しようとする理由を検出できません... gtype.c の関数 check_type_name_I は失敗しますが、両方のケースで g_type_register_static が呼び出される理由がわかりません。

4

1 に答える 1

0

g_once_...glib 2.32 より前では、(ファミリ関数で使用される) スレッド システムを 1 回 (しかも 1 回だけ) 呼び出して初期化する必要がありましたg_thread_init()。さらに、glib 2.36 より前では、型システムを で初期化する必要がありましたg_type_init()

それを知っているg_type_init()

  1. glib < 2.32をチェックすることで、複数の呼び出しg_thread_initから保護します。g_thread_get_initialized()
  2. glib >= 2.36ではnop 関数に解決されます。

g_type_init()起動時に呼び出すだけで、下位互換性のある方法で問題を解決できると思います。

于 2013-02-21T10:08:39.543 に答える