Question

Je suis en train de créer une application mac dans XCode qui a une partie de sa mise en œuvre dans une bibliothèque dynamique.

J'ajouté une nouvelle cible (bibliothèque dynamique) à mon projet de cacao XCode et après un peu de combats avec des cadres et des en-têtes précompilés, ont la compilation dynlib -. Et en cours d'exécution avec succès du débogueur

Lorsqu'il est exécuté autonome mais son évident que le dynlib est au mauvais endroit. « Bibliothèque non chargé: /usr/local/lib/testlib.dynlib ». Sous Windows - ma plus habituelle plate-forme - Dlls peut être placé dans le même dossier que l'exécutable, et partout sur le chemin du système

.

Je préférerais que ma demande de chercher son dynlib quelque part dans son ensemble d'applications (et certains documents semblent confirmer que l'approche correcte), mais je ne sais pas comment.

Est-il possible de configurer le projet XCode afin que le dylib est réellement copié dans le paquet d'application, dans un endroit où l'application va chercher?


Il semble que je ne ai pas besoin d'utiliser otool pour réinitialiser le chemin de recherche. Si je modifier les informations cible -> Construire -> Déploiement -> Répertoire d'installation que je peux changer, à l'intérieur XCode, le chemin qui dyld va regarder le dylib. Par défaut, un nouveau projet de bibliothèque dynamique, le chemin a été mis à /usr/local/lib. Ce que j'ai changé à ./ - otool confirme que maintenant où est ./ dyld va être à la recherche de ce module dynamique spécifique. Malheureusement ./ ne semble pas se référer en fait un répertoire dans mon paquet d'applications: (

Alors, mes questions (sans réponse dans l'autre thread) sont maintenant: 1. Comment puis-je entrer dans un sens relative chemin dans Info cible -> ... -> Installation paramètre Directory, et 2. Comment puis-je obtenir XCode pour copier automatiquement le dylib « cible » dans le dossier du faisceau du paquet application cible à l'emplacement relatif?

Était-ce utile?

La solution

Enfin. Trouvé quelques documentation officielle . Il est possible de faire cela entièrement dans XCode.

Je modifiait à mi-chemin le paramètre Directory installé de la bibliothèque: Il devait être:   @executable_path/../Frameworks

Alors je besoin d'ajouter une compilation « Copier les fichiers » étape à la bibliothèque pour copier réellement dans le dossier Frameworks.

Simple

. Automatique.

Autres conseils

Je crois que vous ne copiez pas la bibliothèque dynamique dans le faisceau d'application au moment de la compilation.

L'application est à la recherche d'un point dans le système de fichiers, mais il ne fait que cela après ne pas trouver à l'intérieur du paquet d'application. Vous devez utiliser la commande otool pour modifier le binaire après sa compilation (en utilisant un script de compilation).

Vous vous trouverez réponse dans cette question précédemment posée: Comment créer une bibliothèque dynamique dans Xcode .

Bonne chance.

Après beaucoup de recherches je l'ai eu, je cherchais à emballer quelques années OpenCV dylib avec ma demande parce que je recevais la « Bibliothèque non chargé: .... ». Erreur

dylibs ont une installation nom qui indique où vous les avez installé lorsque vous l'avez fait la première fois (macports les installe sur / opt / local / lib /). Ils ont aussi le chemin de celle des autres dylib dont ils ont besoin pour travailler. Par exemple, si vous avez le dylib appelé « libopencv_core.2.4.8.dylib » vous pouvez vérifier l'installer le nom et les chemins vers d'autres dylibs qu'il utilise avec cette commande:

otool -L libopencv_core.2.4.8.dylib

La sortie de la commande est le suivant:

libopencv_core.2.4.8.dylib:
/opt/local/lib/libopencv_core.2.4.dylib (compatibility version 2.4.0, current version 2.4.8)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

1- Première ligne:. Nom du fichier que vous archivez

2- Deuxième ligne: Installer le nom du dylib que vous vérifiez. (Macports les installe dans / opt / local / lib /)

3- Troisième ligne: le chemin à d'autres dylibs dont il a besoin au travail qui ne sont pas dans tous les systèmes OSX. (Macports les installe dans / opt / local / lib / et vous les avez parce que vous avez déjà installé, c'est pourquoi si vous distribuez votre application à d'autres macs vous obtenez l'erreur « bibliothèque introuvable »)

4 et 5 - Les lignes 4 et 5: dylibs à l'intérieur de tous les systèmes MacOSX. vous n'avez pas besoin de les copier dans votre projet.

Maintenant, nous le savons, nos objectifs sont les suivants:

1- Changer tous les chemins à l'intérieur dylibs (installer les noms et les chemins vers d'autres dylibs qui sont nécessaires) parce que nous allons mettre nos dylibs à l'intérieur de l'application dans les « Cadres » répertoire, et quand nous nous déplaçons l'application ou le copier à d'autres mac, nous voulons que les dylibs à rechercher l'autre dans le dossier « cadres » dans le répertoire de notre application: le chemin que nous allons utiliser est:

@executable_path/../Frameworks/nameOFTheDylib.dylib

(NB LES DEUX POINTS SONT VRAIMENT IMPORTANT!)

2- Copier Xcode tous les dylibs dont nous avons besoin, mais pas tous les dylibs intérieur / opt / dossier local / lib, juste dont on a besoin: (ils sont tous trop, peut-être 500Mb) nous aurons besoin de suivre les liens des dylibs nous savons que nous devons (en général 4 ou 5) et les dylibs qui sont inclus parce que les 4 ou 5 en ont besoin pour travailler.

Y a finalement fait cette façon:

a) Pour changer les chemins:

1- Copiez tous les / opt / fichier local / lib sur le bureau.

2- Supprimez tous les fichiers dans le dossier lib qui ne sont pas .dylib archives.

3 Mettez ce script dans le dossier lib (en même temps que les dylibs), nous avons copié sur le bureau:

(Copiez ce texte dans TextEdit et l'enregistrer comme theNameYouPrefer.sh)

#!/bin/bash
echo empieza el script

EXECFILE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}
OLDLIBPATH="/opt/local/lib/"
NEWLIBPATH="@executable_path/../Frameworks/"
ACTUALPATH=`pwd`
# space separated list of libraries
for TARGET in ${ACTUALPATH}/* ; do
TARGET=$(basename $TARGET)
    if [ ${TARGET: -6} == ".dylib" ]
    then
        echo otool -DX ${TARGET}
        TARGETID=`otool -DX ${TARGET}`
        echo ${TARGETID}

        echo install_name_tool -id ${NEWLIBPATH}${TARGET} ${TARGET}
        echo `install_name_tool -id ${NEWLIBPATH}${TARGET} ${TARGET}`

        for DYLIB in ${ACTUALPATH}/* ; do
        DYLIB=$(basename $DYLIB)
            if [ ${DYLIB: -6} == ".dylib" ]
            then
                echo install_name_tool -change ${TARGETID} ${NEWLIBPATH}${TARGET} ${DYLIB}
                echo `install_name_tool -change ${TARGETID} ${NEWLIBPATH}${TARGET} ${DYLIB}`
            else
                if [ ${DYLIB: -3} == ".sh" ]
                then
                    echo soyYo
                else
                    echo mkdir ${ACTUALPATH}/eliminadas/
                    echo `mkdir ${ACTUALPATH}/eliminadas/`
                    echo mv ${DYLIB} ${ACTUALPATH}/eliminadas
                    echo `mv ${TARGET} ${ACTUALPATH}/eliminadas`
                fi
            fi
        done
    else
if [ ${TARGET: -3} == ".sh" ] || ![ -h ${TARGET} ]
        then
            echo noMeElimino
        else
            echo mkdir ${ACTUALPATH}/eliminadas/
            echo `mkdir ${ACTUALPATH}/../eliminadas/`
            echo mv ${TARGET} ${ACTUALPATH}/eliminadas/${TARGET}
            echo `mv ${TARGET} ${ACTUALPATH}/../eliminadas`
        fi
    fi
done

echo finaliza el script

4- exécuter:

cd Desktop/lib
sudo ./theNameYouPrefer.sh

Il est vraiment important de fonctionner comme sudo, parce que les dylibs pourraient être protégées en écriture.

À ce stade, vous devriez avoir tous les chemins de dylibs changé. Vous pouvez le vérifier dans certains dylibs avec la commande:

otool -L theDylibYouPrefer.dylib

b) sélectionner uniquement les dylibs nécessaires, pas tout le dossier lib:

1-renommer le dossier lib de lib2: lib =====> lib2

2- Créer un autre dossier (avec le nom que vous préférez, par exemple exampleFolder) dans le bureau, NEXT TO lib2 dossier.

3- Copier l'intérieur exampleFolder les dylibs importantes que vous savez que vous aurez besoin pour vous, dans mon cas, ils sont: libopencv_core.2.4.8.dylib, libopencv_highgui.2.4.8.dylib, libopencv_imgproc.2.4.8.dylib , libopencv_objdetect.2.4.8.dylib

4- Script: le copier dans exampleFolder, à côté des dylibs importants. Je ne sais pas beaucoup sur les scripts, de sorte que celui-ci est un peu plus sale:

#!/bin/bash
echo empieza el script

EXECFILE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}
OLDLIBPATH="/opt/local/lib/"
NEWLIBPATH="@executable_path/../Frameworks/"
ACTUALPATH=`pwd`
# space separated list of libraries
for TARGET in ${ACTUALPATH}/* ; do
TARGET=$(basename $TARGET)
    if [ ${TARGET: -6} == ".dylib" ]
    then
        echo otool -DX ${TARGET}
        TARGETID=`otool -L ${TARGET}`
echo ${TARGETID}

echo :::::::::::::::::::::::::::

ELIM=`echo ${TARGETID} | sed 's/([^)]*)/UUU/g'`
echo $ELIM
#echo ${TARGETID} | sed 's/([^)]*)/UUU/g'
ELIM=`echo $(awk '{gsub("@executable_path/../Frameworks/", "");print}' <<< ${ELIM})`
echo $ELIM

ELIM=`echo $(awk '{gsub(" UUU", "");print}' <<< ${ELIM})`
echo $ELIM

ELIM=`echo $(awk '{gsub(":", "");print}' <<< ${ELIM})`
echo $ELIM

IFS=' ' read -a ARRAY <<< $ELIM

for element in ${ARRAY[@]}
do
    echo $element
    if [[ ${element} == */* ]]
    then
        echo "NO FRAMEWORK";
    else
        echo `mkdir ${ACTUALPATH}/../copy`
        echo `cp ${ACTUALPATH}/../lib2/${element} ${ACTUALPATH}/${element}`
    fi
done


    else
if [ ${TARGET: -3} == ".sh" ] || ![ -h ${TARGET} ]
        then
            echo noMeElimino
        else
            echo mkdir ${ACTUALPATH}/eliminadas/
            echo `mkdir ${ACTUALPATH}/../eliminadas/`
            echo mv ${TARGET} ${ACTUALPATH}/eliminadas/${TARGET}
            echo `mv ${TARGET} ${ACTUALPATH}/../eliminadas`
        fi
    fi
done

echo finaliza el script

5- Exécutez ce script beaucoup de fois, jusqu'à ce que vous appréciez que le nombre de fichiers à l'intérieur exampleFolder ne change pas.

6- Les dylibs dont vous avez besoin sont tous à l'intérieur exampleFolder! Dans mon cas, je suis arrivé 61 dylibs. (Rappelez-vous quand nous avons commencé, je placé là 4 dylibs)

7- La dernière chose que vous devez faire est de laisser tomber l'intérieur du dossier « cadres » dans Xcode. Après cela, RAPPELEZ-VOUS POUR ALLER « CONSTRUIRE PHASES » et ajouter un « copier des fichiers » PHASE: « éditeur » => « ajouter la phase de construction » => « ajouter des fichiers de copie construire la phase » ET DANS LE CLIC DE PHASE « Copier les fichiers » DANS LE PLICON NOUS TOUS LES AJOUTER IL dylibs VOUS TROUVEREZ EN FOLDER « Cadres ». La destination dont vous avez besoin est Frameworks.

Et c'est, je l'ai eu cette façon plus ou moins.

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