Xcode - Application avec fichiers *.dylib

Bonjour tout le monde,



J'essaye de développer une application sous Xcode 4.2.1 (Mac OSX 10.7.4), qui nécessite des librairies dynamiques externes. Ces librairies externes se trouvent dans le dossier : /opt/local/lib/



Mon application qui s'appelle CocoaCV.app fonctionne très bien, mais j'aimerais pouvoir la déployer sur un autre poste ne disposant pas de ces librairies. J'ai donc paramétré le projet dans Xcode de la façon suivante :



Target : CocoaCV



Build Settings :



Library Search Path = /opt/local/lib/



Build Phases :



Link Binary With Libraries :



libopencv_core.2.4.1.dylib

libopencv_imgproc.2.4.1.dylib

libopencv_highgui.2.4.1.dylib

Cocoa.Framework



Copy Files :



libopencv_core.2.4.1.dylib

libopencv_imgproc.2.4.1.dylib

libopencv_highgui.2.4.1.dylib



Une fois le projet archivé, je le partage en "Application", j'obtiens donc un CocoaCV.app qui contient les 3 fichiers *.dylib dans CocoaCV.app/Contents/MacOS/



En essayant de lancer l'application sur une autre machine ne disposant pas de ces librairies j'obtient le message d'erreur suivant :


<br />
Process:		 CocoaCV [7301]<br />
Path:			/Volumes/VOLUME/CocoaCV.app/Contents/MacOS/CocoaCV<br />
Identifier:	  Cisum.CocoaCV<br />
Version:		 1.0 (1)<br />
Code Type:	   X86-64 (Native)<br />
Parent Process:  launchd [237]<br />
Date/Time:	   2012-06-22 14:04:59.583 +0200<br />
OS Version:	  Mac OS X 10.7.4 (11E53)<br />
Report Version:  9<br />
Interval Since Last Report:		  1926828 sec<br />
Crashes Since Last Report:		   43<br />
Per-App Crashes Since Last Report:   5<br />
Anonymous UUID:					  8B700353-1772-4369-8F38-EBE2A0115C96<br />
Crashed Thread:  0<br />
Exception Type:  EXC_BREAKPOINT (SIGTRAP)<br />
Exception Codes: 0x0000000000000002, 0x0000000000000000<br />
Application Specific Information:<br />
dyld: launch, loading dependent libraries<br />
[b][color=#ff0000]Dyld Error Message:<br />
  Library not loaded: /opt/local/lib/libopencv_core.2.4.dylib<br />
  Referenced from: /Volumes/VOLUME/CocoaCV.app/Contents/MacOS/CocoaCV<br />
  Reason: image not found[/color][/b]<br />
Binary Images:<br />
	   0x1059b9000 -		0x1059bafff +Cisum.CocoaCV (1.0 - 1) &lt;91DC4578-B196-3431-9417-B3292EB577C0&gt; /Volumes/VOLUME/CocoaCV.app/Contents/MacOS/CocoaCV<br />
	   0x1059bd000 -		0x1059bdff7 +GlimsLoaderMinimal.dylib (? ?? - ? ??) &lt;6106E9A0-1878-47EF-739B-F2BE8AA38B18&gt; /Library/Frameworks/GlimsAdditions.framework/Library/GlimsLoaderMinimal.dylib<br />
	0x7fff655b9000 -	 0x7fff655edbaf  dyld (195.6 - ? ??) &lt;0CD1B35B-A28F-32DA-B72E-452EAD609613&gt; /usr/lib/dyld<br />




On voit très clairement que ce sont les librairies dynamiques qui ne sont pas chargés. J'ai entendu parler de la commande "install_name_tool" et "otool" mais je n'ai pas réussie à  mettre à  jour les liens. Comment remédier à  ça ?

Réponses

  • yoannyoann Membre
    Mouarf, tu veux pas embarquer tes dylib dans ton bundle ? ça sera plus simple que de faire un pkg qui pose des truc dans les emplacements non standard... Ce qui veux dire éventuellement changer le path embarqué dans la dylib si tu n'as pas fait la compil toi même.



    Voici ici http://stackoverflow.com/questions/8102609/build-cocoa-application-bundle-with-private-dylib-framework
  • ClemClem Membre
    Si justement je veux les embarquer dans mon bundle...
  • AliGatorAliGator Membre, Modérateur
    Je confirme les dires de yoann, il faut utiliser, comme l'indique le lien qu'il a donné sur StackOverflow, install_name_tool pour reconfigurer la lib pour lui changer son "install path" pour qu'il soit relatif au @loader_path.
  • ClemClem Membre
    juin 2012 modifié #5
    Au départ l'utilitaire otool me donne :


    <br />
    <br />
    macbook:Desktop admin&#036; otool -L CocoaCV.app/Contents/MacOS/CocoaCV <br />
    <br />
    CocoaCV.app/Contents/MacOS/CocoaCV:<br />
    [b]/opt/local/lib/libopencv_core.2.4.dylib (compatibility version 2.4.0, current version 2.4.1)[/b]<br />
    [b]/opt/local/lib/libopencv_highgui.2.4.dylib (compatibility version 2.4.0, current version 2.4.1)[/b]<br />
    [b]/opt/local/lib/libopencv_imgproc.2.4.dylib (compatibility version 2.4.0, current version 2.4.1)[/b]<br />
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 17.0.0)<br />
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)<br />
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)<br />
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)<br />
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 635.15.0)<br />
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 833.20.0)<br />
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1138.23.0)<br />
    <br />
    




    Ensuite j'applique :


    <br />
    install_name_tool -change /opt/local/lib/libopencv_core.2.4.dylib @loader_path/libopencv_core.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/CocoaCV&quot;<br />
    <br />
    install_name_tool -change /opt/local/lib/libopencv_highgui.2.4.dylib @loader_path/libopencv_highgui.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/CocoaCV&quot;<br />
    <br />
    install_name_tool -change /opt/local/lib/libopencv_imgproc.2.4.dylib @loader_path/libopencv_imgproc.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/CocoaCV&quot;<br />
    




    Avec otool j'obtiens finalement ça :


    <br />
    macbook:Desktop admin&#036; otool -L CocoaCV.app/Contents/MacOS/CocoaCV<br />
    <br />
    CocoaCV.app/Contents/MacOS/CocoaCV:<br />
    [b]@loader_path/libopencv_core.2.4.1.dylib (compatibility version 2.4.0, current version 2.4.1)<br />
    @loader_path/libopencv_highgui.2.4.1.dylib (compatibility version 2.4.0, current version 2.4.1)<br />
    @loader_path/libopencv_imgproc.2.4.1.dylib (compatibility version 2.4.0, current version 2.4.1)[/b]<br />
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 17.0.0)<br />
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)<br />
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)<br />
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)<br />
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 635.15.0)<br />
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 833.20.0)<br />
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1138.23.0)<br />
    




    Lorsque j'éxécute ce nouveau CocoaCV.app sur un autre poste, j'obtiens le message d'erreur suivant :


    <br />
    [...]<br />
    Dyld Error Message:<br />
      Library not loaded: */libopencv_core.2.4.dylib<br />
      Referenced from: /Users/USER/Desktop/CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib<br />
      Reason: image not found<br />
    [...]<br />
    
  • La lib libopencv_highgui.2.4.1.dylib a besoin d'une autre lib nommée libopencv_core.2.4.dylib (tu noteras que le nom diffère au niveau du numéro de version) et située dans le même répertoire. Je suppose que dans ton installation, il s'agit d'un lien symbolique vers libopencv_core.2.4.1.dylib. Il suffit de mettre à  jour la lib libopencv_highgui.2.4.1.dylib de la même façon que tu as mis à  jour ton exécutable.
  • ClemClem Membre
    Il faut que j'applique cette commande ?


    <br />
    <br />
    <br />
    install_name_tool -change /opt/local/lib/libopencv_highgui.2.4.dylib @loader_path/libopencv_highgui.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib&quot;<br />
    <br />
    
  • install_name_tool -change @rpath/libopencv_core.2.4.dylib @loader_path/libopencv_core.2.4.1.dylib CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib
    
  • ClemClem Membre
    juin 2012 modifié #9
    Finalement je m'en suis sorti avec ceci :


    <br />
    [b]#Core :[/b]<br />
    <br />
    <br />
    install_name_tool -id @loader_path/libopencv_core.2.4.1.dylib CocoaCV.app/Contents/MacOS/libopencv_core.2.4.1.dylib<br />
    <br />
    [b]#ImgProc :[/b]<br />
    <br />
    <br />
    install_name_tool -id @loader_path/libopencv_imgproc.2.4.1.dylib CocoaCV.app/Contents/MacOS/libopencv_imgproc.2.4.1.dylib<br />
    <br />
    install_name_tool -change &quot;lib/libopencv_core.2.4.dylib&quot; @loader_path/libopencv_core.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/libopencv_imgproc.2.4.1.dylib&quot;<br />
    <br />
    install_name_tool -change &quot;lib/libopencv_imgproc.2.4.dylib&quot; @loader_path/libopencv_imgproc.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/libopencv_imgproc.2.4.1.dylib&quot;<br />
    <br />
    [b]#Highgui :[/b]<br />
    <br />
    <br />
    install_name_tool -id @loader_path/libopencv_highgui.2.4.1.dylib CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib<br />
    <br />
    install_name_tool -change &quot;lib/libopencv_core.2.4.dylib&quot; @loader_path/libopencv_core.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib&quot;<br />
    <br />
    install_name_tool -change &quot;lib/libopencv_imgproc.2.4.dylib&quot; @loader_path/libopencv_imgproc.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib&quot;<br />
    <br />
    install_name_tool -change &quot;lib/libopencv_highgui.2.4.dylib&quot; @loader_path/libopencv_highgui.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/libopencv_highgui.2.4.1.dylib&quot;<br />
    <br />
    [b]#Re-link l&#39;application avec tous les *.dylib :[/b]<br />
    <br />
    <br />
    install_name_tool -change &quot;/opt/local/lib/libopencv_core.2.4.dylib&quot; @loader_path/libopencv_core.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/CocoaCV&quot;<br />
    <br />
    install_name_tool -change &quot;/opt/local/lib/libopencv_imgproc.2.4.dylib&quot; @loader_path/libopencv_imgproc.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/CocoaCV&quot;<br />
    <br />
    install_name_tool -change &quot;/opt/local/lib/libopencv_highgui.2.4.dylib&quot; @loader_path/libopencv_highgui.2.4.1.dylib &quot;CocoaCV.app/Contents/MacOS/CocoaCV&quot;<br />
    <br />
    




    Merci bien pour les tuyaux...



    @Baarde, peut tu m'indiquer la signification du @rpath/ ?



    Sinon, peut-on automatiser ces commandes "install_name_tool" directement à  partir d'un projet Xcode ?
  • Pour @rpath, dyld Mac OS X Manual Page.



    Pour automatiser un script lors d'une build, sélectionne la Target puis l'onglet Build Phases, clique sur le bouton Add Build Phase et sélectionne Add Run Script. Dans ton script, tu peux utiliser la variable d'environnement BUILT_PRODUCTS_DIR qui correspond au dossier dans lequel le produit est placé.
  • ClemClem Membre
    @Baarde : Merci beaucoup pour ces informations complémentaires.
Connectez-vous ou Inscrivez-vous pour répondre.