Frage

Ich versuche, eine Mac-Anwendung in XCode zu erstellen, die einige seiner Implementierung in einer dynamischen Bibliothek hat.

Ich habe ein neues Ziel (dynamische Bibliothek) auf mein XCode Kakao-Projekt und nach einem wenig mit Frameworks und vorkompilierte Header zu bekämpfen, habe die dynlib Kompilieren -. Und erfolgreich aus dem Debugger ausgeführt

Bei der Ausführung Standalone jedoch seine offensichtlich, dass der dynlib an der falschen Stelle ist. „Bibliothek nicht geladen: /usr/local/lib/testlib.dynlib“. Auf Windows - meine üblichere Plattform - Dlls können im selben Ordner wie die exe, und überall auf dem Systempfad platziert werden

.

Ich würde eher wie meine Anwendung für seine dynlib irgendwo in seinem Anwendungspaket suchen (und bestimmte Dokumente scheinen dies als den richtigen Ansatz zu bestätigen), aber ich weiß nicht, wie.

Ist es möglich, das Projekt in XCode so zu konfigurieren, dass die dylib tatsächlich in den App-Bundle, in einem Ort kopiert wird, wo die App für sie aussieht?


Es scheint, ich brauche, um den Suchpfad nicht verwenden otool zurücksetzen. Wenn ich die Target-Info bearbeiten -> Build -> Deployment -> Installationsverzeichnis die ich ändern kann, von innen XCode, dass der Weg dyld auf die dylib aussehen wird. In der Standardeinstellung für ein neues dynamischen Bibliothek-Projekt wurde der Pfad /usr/local/lib gesetzt. Welche Ich habe ./ geändert - otool bestätigt, dass ./ jetzt ist, wo dyld für diesen speziellen dynamischen Modul werden wird suchen. Leider ./ scheint nicht wirklich in meinem Anwendungspaket in einem beliebigen Verzeichnis zu verweisen: (

Also, meine Fragen (nicht in dem anderen Thread beantwortet) sind jetzt: 1. Wie gebe ich eine sinnvolle relativ Pfad in dem Target-Info -> ... -> Installationsverzeichnis Einstellung und 2. Wie kann ich XCode automatisch die dylib ‚Ziel‘ in das Anwendungspaket Ziels der Bundle-Ordner auf der relativen Position zu kopieren?

War es hilfreich?

Lösung

Endlich. Gefunden einige offizielle Dokumentation . Es ist möglich, dies zu tun, ganz in XCode.

Ich war schon halb dort installierten Verzeichnis Einstellung der Bibliothek ändern: Es benötigt werden:   @executable_path/../Frameworks

Dann brauchte ich eine „Copy Files“ Schritt in die Bibliothek bauen hinzuzufügen kopieren sie tatsächlich an den Karkassen-Ordner.

Einfach. Automatisch.

Andere Tipps

Ich glaube, Sie sind nicht die dynamische Bibliothek in das Anwendungspaket während der Kompilierung zu kopieren.

Die Anwendung sucht einen Punkt im Dateisystem, aber es funktioniert nur dies, nachdem es nicht innerhalb des Anwendungspaketes zu finden. Sie müssen den otool Befehl verwenden, um die binären zu ändern, nachdem es (unter Verwendung einer Build-Skript) kompiliert wird.

Sie finden Sie in dieser früher gestellte Frage zu beantworten: Wie erstelle ich eine dynamische Bibliothek in Xcode .

Viel Glück.

Nach vieler Forschung habe ich es, ich habe versucht, einige OpenCV dylib die mit meiner Anwendung zu verpacken, weil ich die Aufnahme wurde „Bibliothek nicht geladen: ....“. Fehler

Dylibs haben einen Namen installieren, der angibt, wo Sie sie installiert, wenn Sie es das erste Mal tat (Macports installiert sie auf / opt / local / lib /). Sie haben auch den Weg zu anderen dylib ist, dass sie arbeiten müssen. Zum Beispiel, wenn Sie die dylib namens „libopencv_core.2.4.8.dylib“ haben, können Sie den Namen und die Pfade zu anderen dylibs installieren prüfen, ob sie mit diesem Befehl verwendet:

otool -L libopencv_core.2.4.8.dylib

Die Ausgabe des Befehls lautet:

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- Erste Zeile:. Name der Datei, die Sie überprüfen

2- Zweite Zeile: Installieren Namen des dylib Sie prüfen. (Macports installiert sie in / opt / local / lib /)

3- Dritte Linie: Pfad zu anderen dylibs, die es an die Arbeit benötigt, die nicht in allen OSX Systeme. (Macports installiert sie in / opt / local / lib / und Sie haben sie, weil Sie zuvor installiert, das ist, warum, wenn Sie Ihre Anwendung auf andere macs verteilen erhalten Sie die „Bibliothek nicht gefunden“ Fehler)

4 & 5 - Linien 4 und 5: dylibs innerhalb aller MacOSX-Systeme. Sie brauchen sie nicht in Ihrem Projekt zu kopieren.

Jetzt wissen wir, unsere Ziele sind:

1- Ändern Sie alle Pfade innerhalb dylibs (installieren Namen und Pfade zu anderen dylibs, die benötigt werden), weil wir werden unsere dylibs in der App in der „Frameworks“ Verzeichnis setzen, und wenn wir uns bewegen die App oder kopieren zu anderen mac wollen wir die dylibs für einander im Inneren „Frameworks“ Ordner im Verzeichnis unserer App zu sehen: der Pfad verwenden wir lautet:

@executable_path/../Frameworks/nameOFTheDylib.dylib

(HINWEIS: Die zwei Punkte sind sehr wichtig!)

2- Kopieren Sie alle dylibs Xcode, die wir brauchen, aber nicht alle dylibs innerhalb des / opt / local / lib Ordner, nur die, die wir brauchen: (alle von ihnen sind zu viel, vielleicht 500Mb) wir brauchen die Links von den dylibs folgen wir wissen, dass wir (in der Regel 4 oder 5) und die dylibs müssen, die enthalten sind, weil diejenigen, 4 oder 5 müssen sie für die Arbeit.

Y tat es schließlich so aus:

a) Um die Pfade zu ändern:

1- Kopieren Sie alle / opt / local / lib-Datei auf den Desktop.

2- Entfernen Sie alle Dateien im Ordner lib, die NICHT Archive .dylib werden.

3-Setzen Sie dieses Skript in den Ordner lib (zusammen mit den dylibs) haben wir gerade in den Desktop kopiert:

(Kopieren Sie diesen Text in textEdit und speichern Sie es als 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- es ausführen:

cd Desktop/lib
sudo ./theNameYouPrefer.sh

Es ist wirklich wichtig, es als sudo ausführen können, weil die dylibs werden könnten schreibgeschützt ist.

An diesem Punkt sollten Sie alle haben die dylibs Pfade geändert. Sie können es in einigen dylibs das folgende Kommando:

otool -L theDylibYouPrefer.dylib

b) Wählen Sie nur die dylibs benötigt, die nicht alle Ordner lib:

1-Benennen Sie den Ordner lib zu lib2: lib =====> lib2

2 einen anderen Ordner erstellen (mit dem Namen, den Sie bevorzugen, zum Beispiel exampleFolder) in dem Desktop, nächsten Ordner lib2.

3- Kopie innerhalb exampleFolder wichtigen dylibs, die Sie wissen, dass Sie sie sicher brauchen werden, in meinem Fall sind sie: 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: Kopieren Sie es in exampleFolder, neben den wichtigen dylibs. Ich weiß nicht viel über Skripte, so dass dieser eine ist ein bisschen schmutzig:

#!/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- dieses Skript Führen Sie eine Menge Zeit, bis Sie erkennen, dass die Anzahl der Dateien innerhalb exampleFolder ändert sich nicht.

6- Die dylibs Sie brauchen, sind sie alle in exampleFolder! In meinem Fall habe ich 61 dylibs. (Denken Sie daran, als wir anfingen Ich legte es 4 dylibs)

7- Das letzte, was Sie tun müssen, ist das Innere der Ordner „Frameworks“ in xCode fallen. Danach REMEMBER TO GO TO "-Phasen BUILD" und "Kopieren von Dateien" PHASE ADD: "Editor" => "Build-Phase hinzufügen" => und in den "Kopieren von Dateien" PHASE Klicken Sie in dem PL "Kopieren von Dateien bauen Phase hinzufügen"US ICON UND IN ES DIE GANZE DYLIBS SIE FINDEN IN „Frameworks“ -Ordner. Das Ziel, das Sie benötigen, ist Frameworks.

Und das ist es, ich habe es auf diese Weise mehr oder weniger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top