Question

J'ai un programme (en particulier mon entrée pour le SO DevDays application Défi Compte à rebours ) qui repose sur plusieurs bibliothèques dynamiques, à savoir libSDL, libSDL_ttf, et d'autres. J'ai ces bibliothèques installées sous /opt/local/lib via MacPorts, et beaucoup de gens n'ont pas ces installés (et certains pourraient les faire installer, mais pas à cet endroit).

Comment puis-je distribuer mon programme afin que les gens sans ces bibliothèques installées peuvent exécuter hors-the-box? Il est évident que je vais devoir distribuer les différents fichiers .dylib, mais faire cela est insuffisant. Le chargeur dynamique semble toujours pour les bibliothèques installées aux endroits que je les ai installés à. Est-il possible de dire que le chargeur dynamique regarder dans le répertoire courant de l'exécutable, comme ce que Windows fait avec DLL? Les gens ne devraient pas avoir à modifier les variables d'environnement (par exemple DYLD_LIBRARY_PATH), car encore une fois, je veux que cela fonctionne hors de la boîte.

Était-ce utile?

La solution

Comme vous l'avez mentionné que vous ne l'utilisez Xcode, il est donc un peu difficile. Voici les options dans mon ordre de préférence:

  1. Passez à Xcode. Utiliser des cadres. Les bibliothèques SDL sont disponibles en tant que cadres déjà, et j'ai vu plus de deux jeux commerciaux avec un libsdl.framework intérieur du faisceau d'application.

  2. Utiliser des cadres, mais gardez votre Makefile. Télécharger les versions cadres de vos bibliothèques SDL (ou construire vous-même), et le lien avec eux avec le drapeau de liaison de -Cadre. Distribuez les cadres avec votre application ou ne sont pas, et dites à vos utilisateurs de les mettre soit dans ~ / Library / Frameworks ou dans / Bibliothèque / Frameworks. Je ne voudrais pas déranger avec un installateur pour cela.

  3. lien statiquement contre SDL. Dans le Makefile, vous devrez indiquer le chemin des bibliothèques statiques plutôt que d'utiliser l'option -l, par exemple, vous exécutez « ld bla bla /opt/local/lib/libsdl.a ». Il n'y a aucun moyen que je sais dire -l préférer statique sur les bibliothèques partagées, et croyez-moi, je l'ai regardé.

Autres conseils

L'approche de base à cette question est de les expédier dans le paquet .app. Vous pourrez ensuite modifier l'emplacement l'éditeur de liens recherche les bibliothèques partagées pour inclure cela.

Les étapes sont:

  1. Créer une nouvelle copie de fichiers construire la phase à votre cible qui copie les fichiers dans le répertoire cadres du faisceau .app.

  2. Modifier la configuration de construction "réglage RUNPATH Chemins de recherche" pour inclure @executable_path/../Frameworks

Si vous construisez votre exécutable avec ces modifications et regardez, vous devriez trouver que les dylibs existent dans le répertoire Foo.app/Contents/Framework et otool -L Foo.app/Contents/MacOS/Foo en cours d'exécution devraient céder et à l'entrée préfixé par @rpath pour les dylibs.

A partir de cette Cocoabuilder message :

En général, @loader_path est préférable à @executable_path, comme
permet des cadres intégrés de travailler en un exécutable et un paquet,
plug-in, ou sous-cadre. Le seul inconvénient est que @loader_path
nécessite 10.4 ou plus récent. Si vous êtes sur 10.5 ou plus récent, @rpath est encore
mieux que @loader_path.

lier statiquement les bibliothèques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top