Linkage de dylib dans un framework

ChachaChacha Membre
mai 2008 modifié dans Xcode et Developer Tools #1
Salut,

J'essaye actuellement de développer un framework pour faire des bidouilles. Mon Framework s'appelle ObjectLoader, et fait référence en interne à  différents sous-frameworks (SDL...) et librairies dylib (de boost)
Bon, j'arrive à  empaqueter tout ça de façon assez autonome (ci-joint le projet; attention, nécessite boost pour être compilé, mais je vous livre aussi une version compilée). Le framework principal contient des sous-frameworks et les dylib.

Maintenant, je voudrais utiliser ce framework dans une application normale (ici EssaiMultiDoc). Au démarrage de cette application, le linkage échoue avec les dylib utilisées par ObjectLoader.

Je ne détaille pas : l'idée, c'est que je nage complètement pour arriver à  faire fonctionner les dylibs dans les frameworks. Je vous livre les projets pour que vous puissiez tester aussi.
Y a-t-il des astuces de @executable_name @executable_path à  appliquer sur les dylib ? Ou autre chose ? Dois-je installer les dylib dans d'autres emplacement spéciaux du Framework ?

Help... !

Chacha

Réponses

  • laurrislaurris Membre
    04:25 modifié #2
    @executable_name c'est une typo ou bien ?

    Pasque c'est plutôt @executable_path ou alors @loader_path.
  • ChachaChacha Membre
    04:25 modifié #3
    dans 1212149086:

    @executable_name c'est une typo ou bien ?

    Pasque c'est plutôt @executable_path ou alors @loader_path.

    Heu, oui, pardon c'est une faute de frappe du message.
    Pour détailler un peu, j'ai effectivement essayé d'attribuer de nouveaux install_name aux dylib, et aux frameworks (SDL compris), à  coups de install_name_tool -id
    J'ai essayé avec des @executable_path et @loader_path, j'ai essayé le nouveau @rpath, mais les erreurs arrivent en cascade. Soit ce sont les frameworks, soit les dylib qui ne passent pas. Je n'ai pas su trouver la bonne combinaison, ou alors je me suis trompé en les employant.
  • laurrislaurris Membre
    04:25 modifié #4
    ouais mais tu dis pas si tu as moyen de compiler toi-même les librairies en question ou si elles sont déjà  compilées.
    Dans le premier cas, ça n'a rien de sorcier et d'ailleurs j'ai répondu à  cette question la semaine dernière ici-même.
    Dans le second cas, je vois pas d'autre moyen que install_name_tool mais j'ai pas d'expérience avec donc je ne m'avancerai pas plus.
  • ChachaChacha Membre
    mai 2008 modifié #5
    dans 1212153122:

    ouais mais tu dis pas si tu as moyen de compiler toi-même les librairies en question ou si elles sont déjà  compilées.

    Alors :
    SDL.framework : pré-compilé
    SDL_image.framework : pré-compilé
    libboost*.dylib : c'est moi qui compile avec le Makefile
    ObjectLoader.framework : c'est tout à  moi


    Dans le premier cas, ça n'a rien de sorcier et d'ailleurs j'ai répondu à  cette question la semaine dernière ici-même.
    Dans le second cas, je vois pas d'autre moyen que install_name_tool mais j'ai pas d'expérience avec donc je ne m'avancerai pas plus.


    Disons qu'il me semble avoir bien compris c'est que le install_path, mais que ça ne m'explique pas pourquoi j'échoue.
    Un exemple :
    1)Je modifie le install_path des binaires des SDL*.framework, pour spécifier @loader_path au lieu de @executable_path (grâce à  install_name_tool -id)
    2)Je compile ObjectLoader. Premier échec, un otool -L sur le binaire de ObjectLoader révèle que mon @loader_path est ignoré pour les SDL*.framework, et qu'il garde les @executable_path
    3)Je remplace (grâce à  install_name_tool -change) les @executable_path par des @loader_path dans le binaire de ObjectLoader
    4)Je compile EssaiMultiDoc. otool -L me révèle que le install_name des SDL*.framework pour le binaire ObjectLoader embarqué dans EssaiMultiDoc.app utilisent bien @loader_path
    6)Nouvel échec : EssaiMultiDoc ne se lance pas
    <br />dyld: Library not loaded: @loader_path/../Frameworks/SDL.framework/Versions/A/SDL<br />&nbsp; Referenced from: /Users/chacha/Programmation/Cocoa/EssaiMultiDoc/build/Deployment/EssaiMultiDoc.app/Contents/MacOS/../Frameworks/ObjectLoader.framework/Versions/A/ObjectLoader<br />&nbsp; Reason: image not found<br />
    
  • laurrislaurris Membre
    mai 2008 modifié #6
    Certes. ouais. bon.
    Mais tu sais certainement que pour spécifier le install_path à  la compilation d'un framework/library, il suffit de remplir le build setting INSTALL_PATH = @loader_path dans Xcode.
    Donc tu peux te débrouiller avec ObjectLoader.framework et libboost*.dylib (après conversion en target Xcode).
    Et comme les librairies SDL ont l'air opensource, tu peux aussi les compiler dans Xcode après quelques manoeuvres.

    Je te conseille de faire comme ça plutôt qu'avec install_name_tool. Mais si tu réussis quand même à  l'utiliser, fais le savoir parce que c'est intéressant.

    Pour info, @loader_path n'est utile que pour les frameworks imbriqués, pour les frameworks de premier niveau @executable_path est censé marcher sans pb.
    Par contre , une library linkée à  une autre library, je crois pas que ce soit possible mais apparemment ce n'est pas ton cas.
  • ChachaChacha Membre
    04:25 modifié #7
Connectez-vous ou Inscrivez-vous pour répondre.