我是 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 。