2012-03-29 1 views
0

Je suis un utilisateur GStreamer/programmeur mais je n'ai jamais utilisé GLib directement. Recenty J'ai décidé d'utiliser GLib pour construire un GObject simple et profiter des avantages de la mise en œuvre du signal. (Je suis un programmeur Windows)GObject avertissement ne peut pas enregistrer type existant

J'ai développé une bibliothèque statique simple avec la définition GObject, implémentation. Le lien principal d'application statiquement avec cette bibliothèque et lien dinamically avec l'autre bibliothèque liée statiquement avec le premier aussi.

Si j'appelle

DummyObj * = factice (DummtyObj *) g_object_new (DUMMY_OBJ_TYPE, NULL);

de l'application principale cela fonctionne, mais si l'intérieur de la bibliothèque dynamique je tente de construire une instance DummyObj avec la même fonction, il échoue, dans la sortie, je peux lire

ne peut pas enregistrer le type exisiting ... '! initialization_value = 0' affirmation g_once_init_leave_ n'a g_object_new: affirmation 'G_TYPE_IS_OBJECT (object_tye)' a échoué

au lieu de cela, si est la bibliothèque dynamique le premier à appeler DummyObj * factice = (DummtyObj *) g_object_new (DUMMY_OBJ_TYPE, NULL) après si l'application principale appelle cette fonction, elle échoue avec la même erreur.

Est-ce que c'est comme si le premier contexte? qu'initialiser l'objet est le seul qui peut créer des instances de ce type d'objets.

Je suis un peu confus à ce sujet. Dans GStreamer je peux créer de nouveaux plugins dans mon application principale, à l'intérieur d'autres plugins, bibliothèques dynamiques, je n'ai jamais vu ces erreurs

J'espère avoir bien expliqué, l'anglais n'est pas ma langue maternelle et je pense que le problème est pas facile à expliquer.

Merci beaucoup

Il semble que le premier appel à g_object_new dans tous les contextes tentent d'enregistrer le type dans un hash_table. Le premier peut enregistrer le TYPE mais le second échoue toujours avec la même erreur. En regardant le code je ne suis pas capable de détecter pourquoi le second appel essaie de réenregistrer le type ... la fonction check_type_name_I de gtype.c échoue mais je ne sais pas pourquoi g_type_register_static est appelé dans les deux cas.

Répondre

0

Avant la glib 2.32, vous deviez initialiser le système d'unités d'exécution (utilisé par les fonctions de famille g_once_...) en appelant une fois (et une seule fois) g_thread_init(). En outre, avant glib 2.36 vous deviez initialiser le système de type avec g_type_init().

Sachant que g_type_init():

  1. interne calls g_thread_init par lui-même, la protection de plusieurs appels en vérifiant g_thread_get_initialized() sur glib < 2,32;
  2. se résout à nop function sur glib> = 2,36;

Je pense que vous pouvez résoudre votre problème de manière rétrocompatible en appelant simplement g_type_init() au démarrage.

Questions connexes