2009-09-14 6 views
3

J'ai écrit une application crossplatform Qt4/PyQt4/python, à savoir MyGreatApp, dont la dernière version nécessite le module Phonon. MyGreatApp fonctionne très bien sur ma propre machine sous Mac OS X 10.6 Snow Leopard, et plus généralement sur tous les macs où Qt4.4 arrive à être installé. Cependant, les machines innocentes échouent lamentablement à charger Phonon:Comment déployer une application Qt4/PyQt4/python dépendante de Phonon sur Mac OS X?

WARNING: bool Phonon::FactoryPrivate::createBackend() phonon backend plugin could not be loaded 

Il semble évident que certains restent dans l'dépendances exécutable. Voici les trucs de phonon inclus:

$ find . -name "*phonon*" -print 
./Contents/Frameworks/phonon.framework 
./Contents/Frameworks/phonon.framework/phonon 
./Contents/Frameworks/phonon.framework/phonon.prl 
./Contents/Frameworks/phonon.framework/Versions/4/phonon 
./Contents/plugins/phonon_backend 
./Contents/plugins/phonon_backend/libphonon_qt7.dylib 
./Contents/Resources/lib/python2.5/lib-dynload/PyQt4/phonon.so 

Et voici les install_name_tool commandes, j'invoque après la construction de l'application:

PLUGINSREF = /usr/local/Trolltech/Qt-4.4.3/plugins 
QTLIB  = /usr/local/Trolltech/Qt-4.4.3/lib 
PLUGINS = dist/MyGreatApp.app/Contents/plugins 
RESOURCES = dist/MyGreatApp.app/Contents/Resources 
PHONON  = phonon.framework/Versions/4/phonon 
QTCORE  = QtCore.framework/Versions/4/QtCore 
QTGUI  = QtGui.framework/Versions/4/QtGui 

echo "Installing plugins" 
mkdir -p "$PLUGINS"/phonon_backend 
cp $PLUGINSREF/phonon_backend/libphonon_qt7.dylib "$PLUGINS"/phonon_backend 
install_name_tool -change $QTLIB/$PHONON @executable_path/../Frameworks/$PHONON "$PLUGINS"/phonon_backend/libphonon_qt7.dylib 
install_name_tool -change $QTLIB/$QTCORE @executable_path/../Frameworks/$QTCORE "$PLUGINS"/phonon_backend/libphonon_qt7.dylib 
install_name_tool -change $QTLIB/$QTGUI @executable_path/../Frameworks/$QTGUI "$PLUGINS"/phonon_backend/libphonon_qt7.dylib 

echo "Adding Panther compatibility when building on Leopard" 
install_name_tool -change /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore "$PLUGINS"/phonon_backend/libphonon_qt7.dylib 

echo "Installing dynamic libraries" 
install_name_tool -change $QTLIB/$PHONON @executable_path/../Resources/lib/$PHONON "$RESOURCES"/lib/python2.5/lib-dynload/PyQt4/phonon.so 
install_name_tool -change $QTLIB/$QTCORE @executable_path/../Resources/lib/$QTCORE "$RESOURCES"/lib/python2.5/lib-dynload/PyQt4/phonon.so 
install_name_tool -change $QTLIB/$QTGUI @executable_path/../Resources/lib/$QTGUI "$RESOURCES"/lib/python2.5/lib-dynload/PyQt4/phonon.so 

Toute idée sur ce qui va mal, ou tout soupçon d'améliorer le diagnostic?

+0

Curieux si 'pyinstaller' associé à' appdmg' résout cela pour vous? –

Répondre

3

Si vous regardez dans la distribution source de Qt (il vous suffira peut-être de le télécharger et de le compiler vous-même), il y a un petit utilitaire qui s'appelle "macdeploy_qt". Si vous configurez un ensemble d'applications avec votre exécutable (c.-à-d. Faites un myapp.app et placez l'exécutable 'myapp' dans myapp.app/Contents/MacOS) et exécutez 'macdeploy_qt myapp.app', il analysera tous les install_name_tool s'exécute et framework-to-Resources se déplace pour vous, vous remettant un paquet d'application qui devrait «juste fonctionner» (lourd sur les citations là :)).

+0

"macdeploy_qt" est actuellement inclus dans Qt 4.5, pas dans Qt 4.4, et je n'ai pas réussi à le construire moi-même. Peut-être que je devrais mettre à jour mon installation à Qt 4.5. Cependant, reconstruire tout le désordre (Qt + SIP + PyQT) sur Snow Leopard est assez effrayant pour moi, surtout tant que "le support pour cette version de Mac OS X est encore préliminaire". En fait, j'essaie cela depuis hier, seulement pour que PyQt échoue à l'étape de la configuration. Je suppose que c'est une autre question :-( En tout cas, merci pour votre aimable réponse! – Aristide

+0

Quand j'essaye de construire macdeployqt avec "qmake macdeployqt.pro && make", la dernière commande se plaint de ne pas trouver le fichier "AvailabilityMacros.h ", qui apparaît dans plusieurs sous-répertoires de/Developer/SDKs/... – Aristide

+0

Merci pour le conseil sur ** macdeployqt ** (maintenant ça s'appelle comme ça dans Qt 4.8), ça a vraiment fait ma journée! –