Я пользователь / программист GStreamer, но никогда не использовал GLib напрямую.В последнее время я решил использовать GLib для создания простого GObject и использовать преимущества реализации сигналов.(Я программист Windows)
Я разработал простую статическую библиотеку с реализацией определения GObject.Основное приложение статически связывается с этой библиотекой и динамически связывается с другой библиотекой, статически связанной с первой библиотекой.
Если я позвоню
DummyObj * dummy = (DummtyObj *) g_object_new (DUMMY_OBJ_TYPE, NULL));
из основного приложения это работает, но если внутри динамической библиотеки я пытаюсь создать экземпляр DummyObj с той же функцией, он не работает, в выводе, который я могу прочитать
не может зарегистрироватьсясуществующий тип ... g_once_init_leave_ утверждение 'initialization_value! = 0' не выполнено g_object_new: утверждение 'G_TYPE_IS_OBJECT (object_tye)' не выполнено
Вместо этого, если динамическая библиотека является первой, которая вызывает DummyObj * dummy = (Dummty)g_object_new (DUMMY_OBJ_TYPE, NULL);после того, как основное приложение вызывает эту функцию, оно завершается с той же ошибкой.
Это как первый контекст?эта инициализация объекта является единственной, которая может создавать экземпляры объектов такого типа.
Я немного запутался по этому поводу.В GStreamer я могу создавать новые плагины в своем основном приложении, внутри других плагинов, динамических библиотек, я никогда не видел этих ошибок
Надеюсь, я хорошо объяснил, английский не мой родной язык, и я думаю, чтоЭту проблему нелегко объяснить.
Большое спасибо
Кажется, что первый вызов g_object_new в каждом контексте пытается зарегистрировать TYPE в hash_table.Первый может зарегистрировать ТИП, но второй всегда терпит неудачу с одной и той же ошибкой.Просматривая код, я не могу определить, почему при втором вызове снова пытаются зарегистрировать тип ... функция check_type_name_I в gtype.c не работает, но я не знаю, почему g_type_register_static является вызовом в обоих случаях.