Dylib dans une application...

ersers Membre
Bonjour à  tous,

Alors voilà : j'ai voulu inclure libcurl.4.dylib dans mon application, parce que certaines machines sous 10.4 pas très à  jour ne possèdent pas cette librairie.
J'ai donc mis le fichier dans "Linked Frameworks", "Link Binary With Libraries", et j'ai créé un "Copy Files" pointant sur le dossier de l'exécutable.
Tout se compile à  merveille, la dylib est incluse dans mon programme, tout va bien à  un détail près: j'ai jeté un oeil dans le binaire de l'exécutable et le chemin de la dylib reste collé à  "/usr/lib/libcurl.4.dylib". Bref il ne va jamais chercher la dylib à  côté de lui.
Mon problème est donc de savoir comment expliquer à  Xcode quel est le bon chemin... ???

Merci d'avance pour votre aide...

Réponses

  • ChachaChacha Membre
    10:03 modifié #2
    Salut,

    J'avais fait un post assez détaillé à  ce sujet: http://www.objective-cocoa.org/forum/index.php?topic=2728.msg27201#msg27201
    C'est l'occasion de voir s'il est compréhensible :-D

    N'hésite pas à  redemander

    +
    Chacha
  • ersers Membre
    10:03 modifié #3
    dans 1227268192:

    Salut,

    J'avais fait un post assez détaillé à  ce sujet: http://www.objective-cocoa.org/forum/index.php?topic=2728.msg27201#msg27201
    C'est l'occasion de voir s'il est compréhensible :-D

    N'hésite pas à  redemander

    +
    Chacha


    J'ai été voir et c'est instructif !

    Si j'ai bien tout compris la dylib stocke en elle le chemin que le linker ira inscrire dans l'exécutable ? Et on règle ça avec install_name_tool sur la dylib ?

    J'ai donc pris une copie de libcurl.4.dylib et essayé de faire ça dessus:
    [tt]install_name_tool -id @executable_path/libcurl.4.dylib libcurl.4.dylib
    install_name_tool -change libcurl.4.dylib @executable_path/libcurl.4.dylib libcurl.4.dylib[/tt]

    J'ai été vérifier dans le binaire de libcurl.4.dylib et j'ai bien @executable_path/libcurl.4.dylib inscrit à  la place de usr/lib... bref ça a l'air d'aller.
    J'ai bien sûr utilisé cette lib modifiée dans mon projet.

    Malheureusement dans l'exécutable j'ai toujours "/usr/lib/libcurl.4.dylib"  :'(

    Je vois pas trop où j'ai merdé... j'ai oublié de faire quelque chose ensuite ? Y'aurait pas un flag à  bidouiller pour le linker ? Est-ce que je devrais employer un autre nom que libcurl.4.dylib ? Y'aurait-il un bug de Xcode 3.1.1 ?
  • AliGatorAliGator Membre, Modérateur
    10:03 modifié #4
    Si tu as bien mis partout dans ton projet d'utiliser cette lib modifiée, et que ça ne passe toujours pas, essaye peut-être un Clean de ton projet pour le rebuilder de zéro ?
  • ersers Membre
    10:03 modifié #5
    dans 1227273229:

    Si tu as bien mis partout dans ton projet d'utiliser cette lib modifiée, et que ça ne passe toujours pas, essaye peut-être un Clean de ton projet pour le rebuilder de zéro ?


    J'ai fait un nettoyage, et une recompilation, pareil.

    Finalement j'ai décidé d'essayer quelques trucs, et la solution est venue en renommant libcurl.4.dylib en mylibcurl.4.dylib !

    Employer le même nom que la lib du système avait l'air de tromper le linker. Avec un autre nom, le linker fait bien son boulot. :P

    Mais j'ai encore un soucis, sur Mon iMac Intel (sous 10.5) tout va bien, mais sur mon iMac G3 (sous 10.4) c'est plantage au démarrage et message dans la console: "mylibcurl.4.dylib: no matching architecture in universal wrapper"

    On y arrive, mais c'est pas simple...
  • AliGatorAliGator Membre, Modérateur
    10:03 modifié #6
    Ben le message parle de lui-même : tu dois avoir une version de libcurl.4.dylib compilée uniquement pour Intel. Or ton autre Mac est un G3 donc PPC et pas Intel... Il aurait fallu que tu compiles libcurl en Intel ET en PPC (et les grouper dans la même dylib, avec lipo si le linker sait pas faire tout seul) pour ça.
  • ersers Membre
    novembre 2008 modifié #7
    dans 1227277539:

    Ben le message parle de lui-même : tu dois avoir une version de libcurl.4.dylib compilée uniquement pour Intel. Or ton autre Mac est un G3 donc PPC et pas Intel... Il aurait fallu que tu compiles libcurl en Intel ET en PPC (et les grouper dans la même dylib, avec lipo si le linker sait pas faire tout seul) pour ça.


    Oui forcément que c'est pas moi qui l'ai compilé puisque c'est la libcurl d'Apple. ;)

    Faut donc que j'en trouve les sources et que j'essaye d'en refaire un dylib ?


    J'envisage plutôt une alternative à  tout ça: j'ai "enquêté" sur le pourquoi de l'absence de libcurl.4 sur certaines machines sous 10.4. Il se trouve qu'Apple l'a ajouté lors d'une mise à  jour de sécurité (2008-2) sans rien dire.
    Je me demande si je ne vais pas utiliser la libcurl.4 de l'OS en externe comme je faisais avant, l'indiquer en weak linking dans mon projet, et tester sa présence au démarrage de mon appli, pour si nécessaire afficher une alerte.


    ps: en tout cas merci pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.