2012-03-29 23 views
0

私はGStreamerのユーザ/プログラマですが、私はGLibを直接使用していませんでした。私はGLibを使って単純なGObjectを構築し、シグナル実装を利用することに決めました。 (私はWindowsプログラマです)GObject警告は既存のタイプを登録できません

私は、GObjectの定義、実装で単純な静的ライブラリを開発しました。メインアプリはこのライブラリと静的にリンクしており、他のライブラリとのリンクは最初のものと静的にリンクしています。私が呼び出す場合

DummyObj *ダミー=(DummtyObj *)g_object_new(DUMMY_OBJ_TYPE、NULL);それが動作メインアプリから

が、動的ライブラリ内の私は、同じ機能をDummyObjインスタンスを構築しようとした場合、それは失敗し、出力に私は

を読むことができますexisitingタイプを登録することはできません... g_once_init_leave_アサーション '!initialization_valueは= 0' g_object_newを失敗しました:動的ライブラリは DummyObj *ダミー=(DummtyObj *)g_object_new(DUMMY_OBJ_TYPE、NULLを呼び出すための最初のものである場合、アサーション 'G_TYPE_IS_OBJECT(object_tye)' は、代わりに

を失敗しました); メインアプリケーションがこの関数を呼び出すと、同じエラーで失敗します。

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

これについて少し混乱しています。 GStreamerでは、メインアプリケーション、他のプラグイン、ダイナミックライブラリ内に新しいプラグインを作成できます。これらのエラーは一度も表示されません。

英語が母国語ではないと私は思っています。説明するのは簡単ではありません。

どうもありがとう

すべてのコンテキストでg_object_newする最初の呼び出しはhash_tableにTYPEを登録しようとしているようです。最初のものはTYPEを登録できますが、2番目のものは常に同じエラーで失敗します。コードを見ると、なぜ2番目の呼び出しが型を再度登録しようとしたのかを検出できません... gtype.cのcheck_type_name_I関数は失敗しますが、なぜg_type_register_staticがどちらの場合に呼び出されるのかわかりません。

答えて

0

glib 2.32より前には、ファミリ関数で使用されていたスレッドシステムを、一度だけ(一度だけ)g_thread_init()を呼び出して初期化する必要がありました。さらにglib 2.36の前に、型システムをg_type_init()で初期化しなければなりませんでした。 g_type_init()ことを知っ

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

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

関連する問題