Pergunta

Eu estou tentando criar um aplicativo mac no XCode que tem um pouco de sua aplicação em uma biblioteca dinâmica.

Eu adicionei um novo alvo (biblioteca dinâmica) ao meu projeto de cacau XCode e depois de um pouco de lutar com os quadros e cabeçalhos pré-compilados, têm a dynlib compilar -. E funcionando com sucesso desde o depurador

Quando executado autônomo no entanto a sua evidente que o dynlib está no lugar errado. "Biblioteca não carregada: /usr/local/lib/testlib.dynlib". No Windows - minha plataforma mais usual - Dlls pode ser colocado na mesma pasta que o exe, e em qualquer lugar no caminho do sistema

.

Eu preferiria que meu aplicativo para olhar para o seu lugar dynlib em seu pacote de aplicativos (e certos documentos parecem confirmar isso como a abordagem correta), mas eu não sei como.

É possível configurar o projeto no Xcode para que o dylib realmente é copiado para o pacote de aplicativos, em um lugar onde o aplicativo vai olhar para ele?


Parece que eu não preciso usar otool para redefinir o caminho de pesquisa. Se eu editar o Informações Target -> Build -> Implantação -> Instalação Diretório eu posso mudar, de dentro XCode, o caminho que dyld está indo olhar para o dylib. Por padrão para um novo projeto de biblioteca dinâmica, o caminho foi definido para /usr/local/lib. Que eu mudei para ./ - confirma otool que ./ é agora onde dyld vai estar a olhar para este módulo dinâmico específico. Infelizmente ./ não parecem referir-se, na verdade, para qualquer diretório no meu pacote de aplicativos: (

Então, minhas perguntas (não atendido em outro segmento) agora são: 1. Como faço para entrar em um significativo relação caminho no Informações Target -> ... - Instalação> configuração Directory, e 2. Como posso obter XCode para copiar automaticamente o dylib 'target' para a pasta pacote do alvo pacote da aplicação no local parente?

Foi útil?

Solução

Na última. Encontrado alguns documentação oficial. Sua possível fazer isso inteiramente dentro XCode.

Eu estava no meio do caminho modificando a configuração instalada Diretório da biblioteca: É necessário ser: @executable_path/../Frameworks

Então eu precisava para adicionar um "Copiar arquivos" etapa de compilação para a biblioteca para realmente copiá-lo para a pasta Frameworks.

Simples. Automática.

Outras dicas

Eu acredito que você não está copiando a biblioteca dinâmica para o pacote de aplicativos em tempo de compilação.

A aplicação está à procura de um ponto no sistema de arquivos, mas só faz isso depois de não encontrá-lo dentro do pacote de aplicativos. Você precisa usar o comando otool para modificar o binário depois que ele é compilado (usando um script de construção).

Você vai encontrar você responder nesta questão anteriormente perguntou: Como faço para criar uma biblioteca dinâmica no Xcode .

Boa sorte.

Depois de muita pesquisa eu consegui, eu estava tentando embalar alguns dylib openCV é com o meu pedido, porque eu estava recebendo a "Biblioteca não carregados: ....". Erro

Dylibs ter um nome que indica onde você instalou-los quando você fez isso pela primeira vez instalar (MacPorts instala-los em / opt / local / lib /). Eles também têm o caminho para outra dylib de que eles precisam para trabalhar. Por exemplo, se você tem a dylib chamado "libopencv_core.2.4.8.dylib" você pode verificar o nome instalar e os caminhos para outros dylibs que ele usa com este comando:

otool -L libopencv_core.2.4.8.dylib

A saída do 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- Primeira linha:. Nome do arquivo que você está verificando

2 Segunda linha: nome do dylib você está verificando Instalar. (MacPorts instala-los em / opt / local / lib /)

3 Terceira linha: Caminho para outros dylibs que ele precisa para o trabalho que não estão em todos os sistemas OSX. (MacPorts instala-los em / opt / local / lib / e você tê-los, porque você instalado anteriormente, é por isso que se você distribuir seu aplicativo para outros Macs você começa a "biblioteca não encontrado" erro)

4 & 5 - Linhas 4 e 5: dylibs dentro todos os sistemas de MacOSX. você não precisa copiá-los em seu projeto.

Agora nós sabemos isso, nossos objetivos são:

1- Mudança de todos os caminhos dentro dylibs (instalar nomes e caminhos para outras dylibs que são necessárias) porque nós vamos colocar nossos dylibs dentro do aplicativo no diretório "Frameworks", e quando mover o aplicativo ou copiá-lo a outra mac queremos que os dylibs a olhar para o outro dentro de "estruturas" pasta dentro do diretório do nosso app: o caminho, vamos utilizar é:

@executable_path/../Frameworks/nameOFTheDylib.dylib

(NOTA Os dois pontos são realmente importantes!)

2 Copiar para o Xcode todos os dylibs que precisamos, mas nem todos os dylibs dentro da pasta / opt / local / lib, apenas os que precisamos: (todos eles são muito, talvez 500Mb) precisaremos a seguir os links dos dylibs sabemos que precisamos (geralmente 4 ou 5) e os dylibs que estão incluídos porque aqueles 4 ou 5 necessidade deles para trabalhar.

Y finalmente fiz isto deste modo:

a) Para alterar os caminhos:

1- Copie todos os opt / local / arquivo / lib para o desktop.

2- Retire todos os arquivos dentro da pasta lib que não são arquivos .dylib.

3 Coloque este script dentro da pasta lib (juntamente com os dylibs) temos apenas copiados na área de trabalho:

(Copie este texto no TextEdit e guardá-lo 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 executá-lo:

cd Desktop/lib
sudo ./theNameYouPrefer.sh

É realmente importante para executá-lo como sudo, porque os dylibs poderia ser protegido contra gravação.

Neste ponto, você deve ter todos os caminhos dylibs alterado. Você pode verificá-la em alguns dylibs com o comando:

otool -L theDylibYouPrefer.dylib

b) selecionar apenas os dylibs necessário, nem todos da pasta lib:

1-Renomeie a pasta lib para lib2: lib =====> lib2

2 Crie outra pasta (com o nome de sua preferência, por exemplo exampleFolder) na área de trabalho, pasta lib2 AO LADO.

3 Copiar dentro exampleFolder os dylibs importantes que você sabe que vai precisar deles, com certeza, no meu caso, eles são: 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: copiá-lo dentro exampleFolder, ao lado dos dylibs importantes. Eu não sei muito sobre scripts, então isso é um pouco mais sujo:

#!/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 Executar este script um monte de vezes, até que você aprecia que o número de arquivos dentro exampleFolder não muda.

6 Os dylibs que você precisa são todos eles dentro de exampleFolder! No meu caso, eu tenho 61 dylibs. (Lembre-se quando começamos eu coloquei lá 4 dylibs)

7 A última coisa que você precisa fazer é soltar o dentro da pasta "Frameworks" no Xcode. Depois disso LEMBRE-SE para ir para "FASES construir" e adicionar um "copiar ficheiros" FASE: "editor" => "fase de construção add" => "Copiar arquivos add fase de construção" e dentro do "copiar ficheiros" FASE CLIQUE NO PLUS ícone e adicionar Não encontrar todos os DYLIBS VOCÊ na pasta "Frameworks". O destino que você precisa é Frameworks.

E é isso, eu consegui desta forma, mais ou menos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top