Domanda

Sto costruendo alcune utility da riga di comando in Xcode (semplice C, no Cocoa). Voglio che tutti usino la mia versione personalizzata di libpng e voglio risparmiare spazio condividendo una copia della libreria tra tutti gli eseguibili (non mi dispiace ridistribuire .dylib con loro) .

Devo fare un po 'di magia per ottenere i simboli di esportazione libpng?

" Link Binary With Libraries " costruisce la fase in modo statico?

I documenti di Apple menzionano il caricamento di librerie in fase di esecuzione con dlopen , ma come posso fare in modo che Xcode crei eseguibile senza lamentarmi dei simboli mancanti?


Penso di averlo capito:

  • libpng non si collegava correttamente, perché ho creato eseguibili a 32/64 bit e libreria a 32 bit. Le impostazioni di compilazione della libreria e degli eseguibili devono corrispondere.

  • la configurazione di libpng deve avere tonnellate di definizioni come #define FEATURE_XXX_SUPPORTED

  • " Link Binary With Libraries " la fase di costruzione gestisce bene le librerie dinamiche e DYLD_FALLBACK_LIBRARY_PATH la variabile ambientale è necessaria per caricare .dylib s dal pacchetto dell'applicazione.

È stato utile?

Soluzione

Probabilmente devi assicurarti che la libreria dinamica che costruisci abbia un file di simboli esportato che elenca cosa dovrebbe essere esportato dalla libreria. È solo un elenco semplice dei simboli, uno per riga, da esportare.

Inoltre, quando viene creata la tua libreria dinamica, viene incorporato un nome installazione che è, di default, il percorso in cui è stata costruita. Successivamente tutto ciò che si collega ad esso lo cercherà prima nel percorso specificato e solo successivamente cercherà una (piccola) serie di percorsi predefiniti descritti in DYLD_FALLBACK_LIBRARY_PATH nello sviluppatore dyld (1) man page .

Se hai intenzione di mettere questa libreria vicino ai tuoi eseguibili, dovresti adattare il suo nome di installazione per fare riferimento a quello. Basta fare una ricerca su Google per " nome installazione " dovrebbe trovare un sacco di informazioni su come farlo.

Altri suggerimenti

Collegamento dinamico su Mac OS X, un piccolo esempio

Passaggi:

  1. crea una libreria libmylib.dylib contenente mymod.o
  2. compila e collega un "callmymod" che lo chiama
  3. chiama mymod da callmymod, utilizzando DYLD_LIBRARY_PATH e DYLD_PRINT_LIBRARIES

Problema: tu " solo " desidera creare una libreria da utilizzare per altri moduli. Tuttavia c'è un mucchio spaventoso di programmi - gcc, ld, macosx libtool, dyld - con miliardi di opzioni, del compost ben decomposto e differenze tra MacOSX e Linux. Ci sono tonnellate di pagine man (conto 7679 + 1358 + 228 + 226 righe in 10.4.11 ppc) ma non molto in termini di esempi o programmi con un " dimmi cosa stai facendo " modalità.

(La cosa più importante da capire è fare un semplificato PANORAMICA per te: disegna alcune immagini, esegui alcuni piccoli esempi, spiegalo a qualcun altro).

Background: apple OverviewOfDynamicLibraries , Wikipedia Dynamic_library


Passaggio 1, crea 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

Passaggio 2, compilare e collegare 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

Passaggio 3, esegui il collegamento callmymod a 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

Questo termina un piccolo esempio; spero che aiuti a capire i passaggi.
(Se lo fai molto, vedi GNU Libtool che è glibtool su Mac, e SCons .)
applausi
  - denis

Sfortunatamente, nella mia esperienza, la documentazione di Apple è obsoleta, ridondante e manca MOLTA informazione comune di cui normalmente avresti bisogno.

Ho scritto un sacco di cose su questo sul mio sito web dove dovevo far funzionare FMOD (Sound API) con il mio gioco multipiattaforma che abbiamo sviluppato in uni. È un processo strano e sono sorpreso che Apple non aggiunga ulteriori informazioni sui documenti degli sviluppatori.

Sfortunatamente, come " male " come Microsoft, in realtà fanno un lavoro molto migliore nel prendersi cura dei loro sviluppatori con documentazione (questo proviene da un evangelista di Apple).

Penso che fondamentalmente, quello che non stai facendo è DOPO aver compilato il tuo pacchetto .app. È quindi necessario eseguire un comando sul file binario eseguibile /MyApp.app/contents/MacOS/MyApp per cambiare la posizione in cui l'eseguibile cerca il suo file di libreria. È necessario creare una nuova fase di compilazione in grado di eseguire uno script. Non spiegherò più questo processo, l'ho già approfondito qui:

http: // brockwoolf .com / blog / how-to-use-dinamico-librerie-in-Xcode-31-con-fmod

Spero che questo aiuti.

Sei a conoscenza della pagina di riferimento di Apple Dynamic Temi di programmazione della biblioteca ? Dovrebbe coprire la maggior parte di ciò di cui hai bisogno. Tieni presente che esistono librerie condivise che vengono caricate incondizionatamente all'avvio del programma e librerie caricate dinamicamente (bundle, IIRC) che vengono caricate su richiesta e che le due sono leggermente diverse su MacOS X dagli equivalenti su Linux o Solaris.

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