0

我是 GStreamer 用户/程序员,但我从未直接使用过 GLib。最近我决定使用 GLib 来构建一个简单的 GObject 并利用信号实现。(我是 Windows 程序员)

我已经开发了一个带有 GObject 定义和实现的简单静态库。主应用程序与该库静态链接,并与与第一个静态链接的其他库动态链接。

如果我打电话

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

从主应用程序它可以工作,但是如果在动态库中我尝试使用相同的功能构建一个 DummyObj 实例,它会失败,在输出中我可以读取

无法注册现有类型... g_once_init_leave_ 断言“初始化值!= 0”失败 g_object_new:断言“G_TYPE_IS_OBJECT (object_tye)”失败

相反,如果是动态库第一个调用 DummyObj *dummy = (DummtyObj *) g_object_new(DUMMY_OBJ_TYPE, NULL); 如果主应用程序调用此函数后,它会失败并出现相同的错误。

好像是第一个上下文?初始化对象是唯一可以创建此类对象实例的对象。

我对此有点困惑。在 GStreamer 中,我可以在我的主应用程序、其他插件、动态库中创建新插件,我从未见过这些错误

我希望我已经解释得很好,英语不是我的母语,我认为这个问题不容易解释。

非常感谢

似乎在每个上下文中第一次调用 g_object_new 都会尝试在 hash_table 中注册 TYPE。第一个可以注册 TYPE 但第二个总是失败并出现相同的错误。查看代码我无法检测到为什么第二次调用尝试再次注册类型... gtype.c 中的函数 check_type_name_I 失败但我不知道为什么在这两种情况下都调用 g_type_register_static 。

4

1 回答 1

0

在 glib 2.32 之前,您需要通过调用一次(并且仅一次)来初始化线程系统(由g_once_...系列函数使用)g_thread_init()。此外,在 glib 2.36 之前,您必须使用g_type_init().

知道g_type_init()

  1. 内部调用g_thread_initg_thread_get_initialized()自身,通过检查glib < 2.32来防止多次调用;
  2. 解析为glib >= 2.36 上的nop 函数;

我认为您可以通过g_type_init()在启动时调用以向后兼容的方式解决您的问题。

于 2013-02-21T10:08:39.543 回答