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