Domanda

Ho un programma (in particolare la mia voce per il SO sfida DevDays Countdown app ) che si basa su diverse librerie dinamiche, vale a dire libSDL, libSDL_ttf, e altri. Ho queste librerie installate sotto /opt/local/lib via MacPorts, e molte persone non avranno questi installati (e alcuni di essi presentino loro installato, ma non in quella posizione).

Come faccio a distribuire il mio programma in modo che le persone senza queste librerie installate possono eseguirlo out-of-the-box? Ovviamente dovrò distribuire i vari file .dylib, ma facendo questo non è sufficiente. Il caricatore dinamico sembra ancora per le librerie installate nei punti li ho installati. C'è un modo per dire al loader dinamico di guardare nella directory corrente del file eseguibile, come quello di Windows fa con DLL? La gente non dovrebbe essere necessario modificare le variabili d'ambiente (ad esempio DYLD_LIBRARY_PATH), dal momento che ancora una volta voglio far funzionare tutto questo out-of-the-box.

È stato utile?

Soluzione

Come lei ha ricordato che non stai usando Xcode, quindi è un po 'difficile. Qui ci sono soluzioni per il mio ordine di preferenza:

  1. Passa a Xcode. Utilizzare i quadri. Le librerie SDL sono disponibili come quadri già, e ho visto più di un paio di partite commerciali con un libsdl.framework all'interno del bundle app.

  2. Utilizzare quadri, ma mantenere il vostro Makefile. Scarica le versioni quadro delle vostre librerie SDL (o costruire da soli), e il collegamento con loro con la bandiera -Framework linker. Distribuire i quadri con la tua applicazione o non fare, e dire agli utenti di metterli in entrambi i ~ / Library / Frameworks o in quadri / Libreria /. Non vorrei perdere tempo con un programma di installazione per questo.

  3. collegamento staticamente contro SDL. Nel Makefile, si dovrà elencare il percorso delle librerie statiche, piuttosto che utilizzare il flag -l, ad esempio, si esegue "ld bla bla /opt/local/lib/libsdl.a". Non c'è modo che conosco per raccontare -l preferire statica su librerie condivise, e credetemi, ho guardato.

Altri suggerimenti

L'approccio di base a questo è di spedire loro nel pacchetto .app. Potrai quindi modificare la posizione del linker cerca le librerie condivise per includere questo.

I passi sono:

  1. Creare un nuovo file di copia costruire fase al vostro obiettivo che copia i file nella directory quadri del bundle .app.

  2. Modificare la configurazione di generazione impostazione "RunPath Percorsi di ricerca" per includere @executable_path/../Frameworks

Se si genera il file eseguibile con questi cambiamenti e poi guardare, si dovrebbe trovare che le dylibs esistono nella directory Foo.app/Contents/Framework e funzionante otool -L Foo.app/Contents/MacOS/Foo dovrebbero cedere e l'ingresso preceduto dal @rpath per quei dylibs.

Da questo Cocoabuilder postale :

In generale, è preferibile rispetto @loader_path @executable_path, in quanto
permette quadri di lavorare sia in un eseguibile e un fascio,
incorporato plug-in, o sub-framework. L'unico inconveniente è che @loader_path
richiede 10.4 o più recente. Se siete su 10.5 o più recente, @rpath è ancora
meglio di @loader_path.

staticamente collegare le librerie.

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