Pregunta

Estoy tratando de crear una aplicación de Mac en XCode que tiene parte de su implementación en una biblioteca dinámica.

I añadido un nuevo objetivo (biblioteca dinámica) para mi proyecto de cacao XCode y después de un poco de luchar con los marcos y los encabezados precompilados, tener la compilación dynlib -. Y funcionando con éxito desde el depurador

Cuando se ejecuta independiente sin embargo, su evidente que el dynlib está en el lugar equivocado. "Biblioteca no cargado: /usr/local/lib/testlib.dynlib". En Windows - mi plataforma más habitual - Dlls se puede colocar en la misma carpeta que el archivo ejecutable, y en cualquier parte de la ruta del sistema

.

Yo prefiero que mi aplicación para buscar su dynlib en alguna parte de su paquete de aplicaciones (y algunos documentos parecen confirmar esto como el enfoque correcto), pero no saben cómo hacerlo.

¿Es posible configurar el proyecto en Xcode para que el dylib realidad se copia en el paquete de aplicación, en un lugar donde la aplicación va a buscarlo?


Parece que no necesito usar otool para restablecer la ruta de búsqueda. Si puedo editar la información de destino -> Build -> Implementación -> Directorio de instalación que puedo cambiar, desde el interior de XCode, el camino que dyld se va a mirar para el dylib. De manera predeterminada para un nuevo proyecto de biblioteca dinámica, la ruta se establece en /usr/local/lib. Que he cambiado a ./ - otool confirma que ./ es ahora donde dyld va a estar buscando este módulo dinámico específico. Desafortunadamente ./ no parece referirse en realidad a cualquier directorio en mi paquete de aplicaciones: (

Por lo tanto, mis preguntas (no se contesta en el otro hilo) ahora son: 1. ¿Cómo se introduce un en el camino de Información Objetivo significativa relativa -> ... -> configuración Directorio de instalación, y 2. ¿Cómo puedo obtener XCode para copiar automáticamente el dylib 'objetivo' en la carpeta de paquete del paquete de la aplicación de destino en la ubicación relativa?

¿Fue útil?

Solución

Por fin. Se han encontrado algunos href="http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/CreatingFrameworks.html" documentación oficial . Su posible hacer esto enteramente dentro de XCode.

Yo estaba a mitad de camino modificar la configuración Directorio instalado de la biblioteca: Tenía que ser:   @executable_path/../Frameworks

A continuación, que tenía que añadir un "Copiar archivos" construir paso a la biblioteca para realmente copiarlo a la carpeta Marcos.

simple. Automático.

Otros consejos

Creo que no está copiando la biblioteca dinámica en el paquete de la aplicación en tiempo de compilación.

La aplicación está en busca de un punto en el sistema de archivos, pero sólo lo hace después de no encontrar en el interior del paquete de aplicaciones. Es necesario utilizar el comando otool modificar el binario después de que se compila (usando un script de compilación).

Usted encontrará su respuesta en esta pregunta hecha anteriormente: ¿Cómo se crea una biblioteca dinámica en Xcode .

Buena suerte.

Después de mucha investigación lo tengo, yo estaba tratando de empaquetar algunas de dylib OPENCV con mi aplicación, ya que estaba recibiendo la "Biblioteca no está cargado: ....". Error

Dylibs tener un nombre que indica dónde instalar los instaló cuando lo hizo la primera vez (macports las instala en / opt / local / lib /). También tienen el camino a otros de dylib que necesitan para funcionar. Por ejemplo, si usted tiene la dylib llamado "libopencv_core.2.4.8.dylib" se puede comprobar el nombre de instalación y las rutas a otras dylibs que utiliza con este comando:

otool -L libopencv_core.2.4.8.dylib

La salida del comando es:

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- Primera línea:. Nombre del archivo que está mirando

2- Segunda línea: Instalar nombre del dylib se está comprobando. (Macports las instala en / opt / local / lib /)

3- Tercera línea: Camino a otros dylibs que necesita para el trabajo que no se encuentran en todos los sistemas OSX. (Macports los instala en / opt / local / lib / y que los tiene, porque ha instalado previamente, por eso si distribuye su aplicación a otros equipos Mac se obtiene el error "biblioteca no encontrado")

4 y 5 - Las líneas 4 y 5: dylibs dentro de todos los sistemas MacOSX. no es necesario copiarlos en su proyecto.

Ahora que sabemos esto, nuestros objetivos son:

1- cambiar todas las rutas dentro del dylibs (instalar nombres y las rutas a otras dylibs que se necesitan) porque vamos a poner nuestros dylibs dentro de la aplicación en el directorio "marcos", y cuando nos movemos de la aplicación o copiamos a otro Mac queremos que los dylibs para buscar entre sí carpeta dentro de "marcos" dentro del directorio de nuestra aplicación: el camino vamos a utilizar es:

@executable_path/../Frameworks/nameOFTheDylib.dylib

(tenga en cuenta los dos puntos son muy importantes!)

2- Copiar a Xcode todos los dylibs que necesitamos, pero no todos los dylibs dentro de la carpeta / opt / local / lib, justo los que necesitamos: (todos ellos son demasiado, tal vez 500Mb) necesitaremos para seguir los enlaces de los dylibs sabemos que necesitamos (normalmente 4 o 5) y los dylibs que se incluyen debido a los 4 o 5 ellos necesitan para trabajar.

Y finalmente lo hizo de esta manera:

a) Para cambiar las rutas de acceso:

1- copiar todos los archivos / opt / local / lib en el escritorio.

2- eliminar todos los archivos dentro de la carpeta de la liberación que NO son .dylib archivos.

3-Ponga este script dentro de la carpeta de la liberación (junto con los dylibs) que acabamos de copiado en el escritorio:

(Copia este texto en textEdit y guardarlo como 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- ejecutarlo:

cd Desktop/lib
sudo ./theNameYouPrefer.sh

Es realmente importante para ejecutarlo como sudo, porque los dylibs podrían ser protegidos contra escritura.

En este punto, usted debe tener todos los caminos dylibs cambiaron. Puede comprobarlo en algunos dylibs con el comando:

otool -L theDylibYouPrefer.dylib

b) seleccionar sólo el dylibs necesarios, no toda la carpeta lib:

1-Cambiar el nombre de la carpeta lib a lib2: lib =====> lib2

2- Crear otra carpeta (con el nombre que prefiera, por ejemplo exampleFolder) en el escritorio, AL LADO DE LIB2 carpeta.

3- Copiar el interior exampleFolder los dylibs importante que sepa que los necesitará a ciencia cierta, en mi caso son: 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 Guión: copiarlo dentro exampleFolder, junto a los dylibs importantes. No sé mucho acerca de las secuencias de comandos, por lo que éste es un poco más sucia:

#!/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- Ejecutar este script una gran cantidad de veces, hasta que usted aprecia que el número de archivos dentro de exampleFolder no cambia.

6- Los dylibs que necesita son todos ellos dentro de exampleFolder! En mi caso, tengo 61 dylibs. (Recuerde cuando empezamos coloqué allí 4 dylibs)

7- La última cosa que necesita hacer es soltar el interior de la carpeta "Marcos" en Xcode. Después de eso Recuerde que debe ir para "construir FASES" y añadir un "archivos de copia" FASE: "editor" => "añadir fase de construcción" => "Añadir archivos de copia construyen fase" y dentro de los "archivos de copia" FASE CLIC EN LA PLEEUU icono y ADD allí todo el DYLIBS que se encuentra en "marcos" carpeta. El destino que necesita es Marcos.

Y eso es todo, lo tengo de esta manera más o menos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top