2010-01-22 9 views
8

Je développe une application qui utilise la bibliothèque GStreamer. Afin de faciliter le déploiement, j'aimerais collecter toutes les bibliothèques GStreamer dans un bundle local. Pour cela, j'ai écrit un petit script qui effectue les opérations suivantes:Comment déployer une application qui dépend des bibliothèques dynamiques?

  • dépendances récursive traverse (en utilisant otool -L)
  • copie toutes les dépendances dans un répertoire local
  • faire tous les chemins de dépendance par rapport à @executable_path (en utilisant install_name_tool)

(Si vous êtes intéressés, vous pouvez jeter un oeil à la Ruby script.)

Cependant, je vois maintenant des erreurs d'exécution sur l'appel gst_init:

(process:22843): GLib-GObject-CRITICAL **: gtype.c:2458: initialization assertion failed, use g_type_init() prior to this function 

(process:22843): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed 

Ces erreurs ne se produisent que si j'utilise les bibliothèques localisées. Y a-t-il des «pièges courants» quand il s'agit d'utiliser install_name_tool?


Est-ce que quelqu'un a une idée de ce que je pourrais faire de mal? Si vous avez besoin de connaître certains détails, n'hésitez pas à demander.

Mise à jour
j'ai changé quelques petites choses:

  • Pour les bibliothèques dépendantes je change maintenant que les chemins de dylib et non l'identifiant (utilisez uniquement install_name_tool -change et non install_name_tool -id). Pour la bibliothèque principale, j'ai défini la valeur d'id relative au chemin exécutable (@executable_name/components/Video.dylib).

Ces deux modifications le font fonctionner. Cependant, il n'est pas encore clair pour moi pourquoi cela fonctionne. J'ai quelques difficultés à comprendre la signification de la propriété "id". Il semble être identificateur sous la forme d'un chemin d'accès. Pourquoi l'avoir modifié pour les bibliothèques dépendantes provoque-t-il des erreurs d'exécution? Je vais essayer de trouver des réponses à ces questions avec un peu plus d'expérimentation ...

+0

Pourriez-vous influencer l'ordre de chargement des dépendances respectives par accident? –

+0

@gf: Je ne pense pas, mais je vais le garder à l'esprit. J'ai fait quelques progrès, vérifiez la modification si vous êtes intéressé. – StackedCrooked

+0

Ne construisez-vous pas un ensemble .app? –

Répondre

1

peut-être vous devriez envisager une compilation statique de votre code. sera jointe à vos dépendances à votre programme beaucoup mieux

si vous utilisez gcc il suffit d'ajouter -static

0

GStreamer est un système complexe, avec beaucoup de dépendances. L'utilisation d'outils permettra de trouver des bibliothèques partagées directement requises par GStreamer, mais elles manqueront sûrement des bibliothèques chargées dynamiquement, des fichiers de configuration, ainsi que des données de traduction.

This site probably contains some usefull info lors de la création d'un package GStreamer autonome, ce qui pourrait simplifier le processus de regroupement.