Pergunta

Estou construindo alguns utilitários de linha de comando no Xcode (C simples, sem cacau). Eu quero todos eles para usar a minha versão personalizada do libpng, e eu quero economizar espaço através da partilha de uma cópia da biblioteca entre todos os executáveis ??(Eu não me importo re-distribuição .dylib com eles).

Do que eu preciso fazer alguma mágica para obter libpng símbolos de exportação?

O "link binário com Bibliotecas" link fase de construção estaticamente?

docs da Apple mencionar carregamento de bibliotecas em tempo de execução com dlopen, mas como posso fazer Xcode criar executável sem reclamar sobre símbolos que faltam?


Eu acho que percebi isso:

  • libpng não estava ligando corretamente, porque eu construí 32 executáveis ??/ 64-bit e 32-bit biblioteca. configurações de compilação da biblioteca e arquivos executáveis ??devem corresponder.

  • necessidades config.h do libpng ter toneladas de define como #define FEATURE_XXX_SUPPORTED

  • "Link binário com Bibliotecas" alças fase de construção bibliotecas dinâmicas muito bem, e DYLD_FALLBACK_LIBRARY_PATH variável ambiental é neccessary para .dylibs carregamento de pacote de aplicativos.

Foi útil?

Solução

Você provavelmente precisará garantir que a biblioteca dinâmica você compilação tem um arquivo de símbolos exportados que as listas que devem ser exportados a partir da biblioteca. É apenas uma lista simples dos símbolos, um por linha, para exportação.

Além disso, quando sua biblioteca dinâmica é criada, ele recebe um instalar nome incorporado dentro dele que é, por padrão, o caminho no qual ele é construído. Posteriormente qualquer coisa que as ligações contra ele irá procurá-lo no caminho especificado em primeiro lugar e só depois procurar um conjunto (pequeno) de caminhos padrão descritos em DYLD_FALLBACK_LIBRARY_PATH na página homem dyld(1) .

Se você estiver indo para colocar esta biblioteca ao lado de seus executáveis, você deve ajustar o seu nome instalar a referência que. Basta fazer uma pesquisa no Google por "instalar nome" deve transformar-se uma tonelada de informações sobre como fazer isso.

Outras dicas

dinâmico ligando no Mac OS X, uma pequena exemplo

Passos:

  1. criar um libmylib.dylib biblioteca contendo mymod.o
  2. compilação e vincular um "callmymod", que chama-lo
  3. MyMod de callmymod, usando DYLD_LIBRARY_PATH e DYLD_PRINT_LIBRARIES chamada

Problema: você "apenas" quer criar uma biblioteca para outros módulos para uso. No entanto, há uma pilha assustadora de programas - gcc, ld, macosx libtool, dyld - com zilhões de opções, algum composto bem-apodreceu, e diferenças entre MacOSX e Linux. Há toneladas de páginas man (eu conto 7679 + 1358 + 228 + 226 linhas em 10.4.11 ppc) mas não muito na forma de exemplos, ou programas com um "me diga o que você está fazendo" mode.

(A coisa mais importante na compreensão é fazer um simplificado PANORAMA por si mesmo: tirar algumas fotos, executar alguns pequenos exemplos, explicá-lo para outra pessoa).

Fundo: maçã OverviewOfDynamicLibraries , Wikipedia Dynamic_library


Passo 1, criar libmylib.dylib -

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

Passo 2, de compilação e ligação callmymod -

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

Passo 3, callmymod executar ligando para libmylib.dylib -

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

que termina um pequeno exemplo; espero que ajude compreender as etapas.
(Se você fizer isso muito um, consulte GNU Libtool que é glibtool em Macs, e SCons .)
aplausos
- denis

Infelizmente, na minha experiência documentação da Apple é antiquado, redundante e faltando um monte de informação comum que você normalmente precisa.

Eu escrevi um monte de coisas sobre isso no meu site onde eu tinha que pegar FMOD (API Sound) para trabalhar com o meu jogo de plataforma cruzada que nós desenvolvemos na uni. É um processo estranho e eu estou surpreso que a Apple não adicionar mais informações sobre seus documentos para desenvolvedores.

Infelizmente, como "mal", como Microsoft são, eles realmente fazer um trabalho melhor muito de cuidar de seus desenvolvedores com documentação (este é proveniente de um evangelista da Apple).

Eu acho que, basicamente, o que você não está fazendo é depois de ter compilado seu .app Bundle. Então você precisa para executar um comando no executável /MyApp.app/contents/MacOS/MyApp binário, a fim de alterar o local onde os olhares executáveis ??para o seu arquivo de biblioteca. Você deve criar uma nova fase de construção que pode executar um script. Não vou explicar esse processo novamente, eu já ter feito isso em profundidade aqui:

http: // brockwoolf .com / blog / how-to-use-dinâmico-bibliotecas-em-xcode-31-usando-fmod

Espero que isso ajude.

Você está ciente da página de referência da Apple Dinâmico Tópicos de programação biblioteca ? Ele deve cobrir a maior parte do que você precisa. Esteja ciente de que há uma bibliotecas compartilhadas que são carregados incondicionalmente na inicialização do programa e bibliotecas carregadas dinamicamente (bundles, IIRC) que são carregados sob demanda, e os dois são um pouco diferentes em MacOS X dos equivalentes no Linux ou Solaris.

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