私は 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 が呼び出される理由がわかりません。