2009-03-12 16 views
9

Je suis en train de développer un programme en Qt et il utilise la bibliothèque libqextserialport.1.dylib.Comment puis-je lier une bibliothèque dynamique dans Xcode?

Je construis et en cours x code et recrache:

dyld: Library not loaded: libqextserialport.1.dylib 
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV 
    Reason: image not found 

La bibliothèque est située dans/Users/samuelreh/Desktop/QtOpenCV/qextserialport/build /.

Je peux exécuter mon programme en changeant le dossier exécutable /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ et en entrant:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

Je sais il y a probablement beaucoup de solutions à part cela. Quelqu'un connaît-il le meilleur/le plus élégant/le plus facile à faire du x-code?

Répondre

2

Si je comprends bien votre problème, votre application se construit bien, pas d'erreurs lors de la liaison, mais lorsque vous essayez de le lancer, la bibliothèque est introuvable.

Ce n'est pas étonnant, puisque le fichier dylib se trouve dans un répertoire arbitraire qui n'est pas sur le chemin du système. Vous devez soit le copier dans /usr/lib (probablement pas une bonne idée) ou l'inclure dans le paquet d'application. Ce dernier est probablement la meilleure approche.

Je ne l'ai jamais essayé, mais apparemment vous devez utiliser un Copy Files Build Phase pour mettre le dylib dans votre bundle, puis configure Xcode pour que votre exécutable sache où le trouver.

+0

Et si vous construisiez un exécutable sans bundle? – John

0

Vous venez de faire glisser la bibliothèque du répertoire sur votre projet Xcode, mieux dans les ressources, mais ce n'est pas grave (je crois). J'ai essayé avec et sans vérifier le 'copier des fichiers dans le paquet' et cela fonctionne dans les deux cas, pas sûr si vous devez l'inclure dans le paquet pour le déploiement.

J'ai testé cela avec sqlite3 et l'application de cacao (cacao-touch).

4

Je viens de faire exactement cela, avec un projet Module Bundle. Cela a été inclus dans un projet plus important avec un exécutable distinct.

J'ai ajouté une étape "Copier les dylibs dans les frameworks", qui copiait les dylibs dans /Foobar.bundle/Contents/Frameworks/Foobar/. Ensuite, j'ai ajouté une phase d'exécution de script pour exécuter l'étape finale, pour fixer les installer noms des dylibs dans l'exécutable:

install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar 

Bien sûr, libBobDylan.dylib également lié à libBillyIdol.dylib. Donc, je devais ajouter un autre Exécuter le script de phase au début de la cible pour fixer les noms installer ici:

install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib 

J'ai eu plus d'une douzaine d'entre eux pour relier contre; J'ai dû persuader le fournisseur de dylibs de remplir leur en-tête pour accommoder mes nombreux changements de nom d'installation ...