Предупреждение GObject не может зарегистрировать существующий тип

Я пользователь/программист 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 вызывается в обоих случаях.


person Carles Bolaños    schedule 29.03.2012    source источник


Ответы (1)


До glib 2.32 от вас требовалось инициализировать систему потоков (используемую функциями семейства g_once_...), вызвав один раз (и только один раз) g_thread_init(). Кроме того, до glib 2.36 вам приходилось инициализировать систему типов с помощью g_type_init().

Зная, что g_type_init():

  1. внутренне вызывает g_thread_init сам по себе , защита от множественных вызовов проверкой g_thread_get_initialized() на glib ‹ 2.32;
  2. разрешается в nop-функцию для glib >= 2,36;

Я думаю, что вы можете решить свою проблему обратно совместимым способом, просто вызвав g_type_init() при запуске.

person ntd    schedule 21.02.2013