GObject предупреждение не может зарегистрировать существующий тип - PullRequest
0 голосов
/ 29 марта 2012

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

1 Ответ

0 голосов
/ 21 февраля 2013

До появления версии 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; </li>
  2. разрешает функцию nop на glib> = 2.36;

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

...