Domanda

Sto cercando di creare un'applicazione Mac in XCode che ha un certo della sua attuazione in una libreria dinamica.

Ho aggiunto un nuovo obiettivo (libreria dinamica) al mio progetto di cacao XCode e dopo un po 'di lotta con quadri e le intestazioni precompilate, avere la dynlib compilazione -. E l'esecuzione con successo dal debugger

Quando si esegue standalone tuttavia la sua evidente che il dynlib è nel posto sbagliato. "Libreria non caricato: /usr/local/lib/testlib.dynlib". Su Windows - la mia piattaforma più usuale - DLL può essere collocato nella stessa cartella del file exe, e in qualsiasi punto del percorso di sistema

.

Vorrei un po 'come la mia applicazione per cercare la sua dynlib da qualche parte nel suo bundle dell'applicazione (e alcuni documenti sembrano confermare questo come l'approccio corretto), ma non so come.

E 'possibile configurare il progetto in XCode in modo che il dylib in realtà viene copiato nel pacchetto app, in un luogo in cui l'applicazione cercherà per questo?


Sembra non ho bisogno di usare otool per reimpostare il percorso di ricerca. Se modifico l'Info Target -> Build -> Distribuzione -> Installazione Elenco posso cambiare, dall'interno XCode, il percorso che dyld sta andando a guardare per il dylib. Per impostazione predefinita per un nuovo progetto di libreria dinamica, il percorso è stato impostato su /usr/local/lib. Che ho cambiato in ./ - otool conferma che ./ è ora in cui dyld sta per essere alla ricerca di questo modulo dinamico specifica. Purtroppo ./ non sembra riferirsi in realtà a qualsiasi directory nel mio bundle dell'applicazione: (

Quindi, le mie domande (non si risponde in altro thread) ora sono: 1. Come faccio a inserire un relativa percorso nella destinazione Info significativa -> ... -> Installazione impostazione Directory e 2. Come posso ottenere XCode per copiare automaticamente il dylib 'target' nella cartella fagotto l'applicazione del bersaglio fascio nella posizione relativa?

È stato utile?

Soluzione

Finalmente. Trovato alcuni href="http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/CreatingFrameworks.html" documentazione ufficiale . La sua possibile farlo interamente all'interno XCode.

Sono stato a metà strada modificando l'impostazione Directory installata della biblioteca: Doveva essere:   @executable_path/../Frameworks

Poi ho bisogno di aggiungere un "File Copy" costruire passo in biblioteca a realtà copiarlo nella cartella Frameworks.

Semplice. Automatico.

Altri suggerimenti

Io credo che non si copia la libreria dinamica nel bundle dell'applicazione in fase di compilazione.

L'applicazione è alla ricerca di un punto nel filesystem, ma lo fa solo questo dopo non trovare all'interno del bundle dell'applicazione. È necessario utilizzare il comando otool per modificare il file binario dopo che è stato compilato (utilizzando uno script di build).

Troverete si risponde a questa domanda ha chiesto in precedenza: Come creare una libreria dinamica in Xcode .

In bocca al lupo.

Dopo molte ricerche ho capito, stavo cercando di confezionare alcuni OpenCV dylib di con la mia domanda perché mi stavo ricevendo la "Libreria non caricato: ....". Errore

Dylibs avere un nome di installazione che indica dove sono stati installati quando avete fatto la prima volta (macports li installa su / opt / local / lib /). Essi hanno anche il percorso per gli altri dylib di cui hanno bisogno per lavorare. Ad esempio, se avete la dylib chiamato "libopencv_core.2.4.8.dylib" è possibile controllare il nome di installazione ei percorsi ad altri dylibs che utilizza con questo comando:

otool -L libopencv_core.2.4.8.dylib

L'output del comando è:

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- Prima riga:. Nome del file che si sta verificando

2- Seconda riga: Installare nome del dylib si sta verificando. (Macports li installa in / opt / local / lib /)

3- Terza riga: Percorso ad altri dylibs che ha bisogno di un lavoro che non sono in tutti i sistemi OSX. (Macports li installa in / opt / local / lib / e si deve loro, perché è stato installato in precedenza, ecco perché se si distribuisce la vostra applicazione per altri Mac si ottiene l'errore "libreria non trovato")

4 e 5 - Linee 4 e 5: dylibs all'interno di tutti i sistemi MacOSX. non è necessario copiarli nel vostro progetto.

Ora sappiamo che questo, i nostri obiettivi sono:

1- cambiare tutti i percorsi all'interno dylibs (installare nomi ei percorsi ad altri dylibs che sono necessari), perché ci accingiamo a mettere i nostri dylibs dentro l'applicazione nella directory "quadri", e quando ci muoviamo app o copiarlo ad altri Mac vogliamo che i dylibs per cercare ogni altra cartella dentro "quadri" all'interno della directory della nostra applicazione: il percorso useremo è:

@executable_path/../Frameworks/nameOFTheDylib.dylib

(notare i due punti sono davvero importanti!)

2 Copia per Xcode tutte le dylibs di cui abbiamo bisogno, ma non tutti i dylibs all'interno della cartella / opt / local / lib, solo quelli di cui abbiamo bisogno: (tutti sono troppo, forse 500Mb) avremo bisogno a seguire i collegamenti dalle dylibs sappiamo che abbiamo bisogno (di solito 4 o 5) e le dylibs che sono inclusi perché quelli 4 o 5 di loro hanno bisogno per lavorare.

Y finalmente fatto in questo modo:

a) Per modificare i percorsi:

1- copiare tutti i file / opt / local / lib al desktop.

2- Rimuovere tutti i file all'interno della cartella lib che NON sono .dylib archivi.

3-Mettete questo script all'interno della cartella lib (insieme ai dylibs) che abbiamo appena copiato sul desktop:

(Copiare questo testo in TextEdit e salvarlo come 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- eseguirlo:

cd Desktop/lib
sudo ./theNameYouPrefer.sh

E 'davvero importante per eseguirlo come sudo, perché i dylibs potevano essere protetto da scrittura.

A questo punto si dovrebbe avere tutti i percorsi dylibs cambiati. È possibile controllare in alcuni dylibs con il comando:

otool -L theDylibYouPrefer.dylib

b) Selezionare solo i dylibs necessari, non tutti della cartella lib:

1-Rinominare la cartella lib a lib2: lib =====> lib2

2- Creare un'altra cartella (con il nome che preferite, ad esempio exampleFolder) sul desktop, VICINO AL LIB2 cartella.

3- Copia all'interno exampleFolder le dylibs importante che tu sappia avrete bisogno di loro di sicuro, nel mio caso essi sono: 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: copiarlo all'interno exampleFolder, accanto ai dylibs importanti. Io non so molto di script, quindi questo è un po 'più sporca:

#!/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- eseguire questo script un sacco di volte, fino a quando non apprezzare il fatto che il numero di file all'interno di exampleFolder non cambia.

6- I dylibs necessari sono tutti all'interno exampleFolder! Nel mio caso, ho avuto 61 dylibs. (Ricordate quando abbiamo iniziato ci ho messo 4 dylibs)

7- L'ultima cosa che devi fare è cadere la all'interno della cartella "Frameworks" in Xcode. Dopo di che ricordarsi di andare per "costruire FASI" e aggiungere un FASE "Copiare i file": "Editor" => "aggiungere fase di costruzione" => "Aggiungi file copia fase di costruzione" E DENTRO LA FASE CLICK "file copia" IN PLUS ICONA e aggiungere lì tutto il DYLIBS che si trova in "quadri" Cartella. La destinazione che vi serve è Frameworks.

E questo è tutto, ho ottenuto in questo modo, più o meno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top