Domanda

Ho cercato di produrre un "binario singolo" collegato staticamente versione del mio gioco per Windows. Voglio collegarmi con sdl, sdl_image e sdl_mixer che a loro volta richiamano alcune librerie di supporto. Sfortunatamente non ho trovato il modo di farli compilare e collegare tutti usando cygwin / mingw / gcc. Per quanto ne so, tutte le versioni pubbliche esistenti sono solo librerie / dll condivise.

Nota che non sto parlando di licenze qui. La fonte sarà aperta, pertanto la GPL / LGPLness di sdl non è rilevante.

È stato utile?

Soluzione

Durante la compilazione del progetto, è necessario apportare solo un paio di modifiche al proprio makefile.

  • Invece di sdl-config --libs , usa sdl-config --static-libs
  • Circonda l'uso del suddetto sdl-config --static-libs con -Wl, -Bstatic e -Wl, -Bdynamic . Questo dice a GCC di forzare il collegamento statico, ma solo per le librerie specificate tra di loro.

Se il tuo makefile attualmente assomiglia a:

SDLLIBS=`sdl-config --libs`

Modificalo in:

SDLLIBS=-Wl,-Bstatic `sdl-config --static-libs` -Wl,-Bdynamic

Queste sono in realtà le stesse cose che dovresti fare su sistemi simili a Unix, ma di solito non causa tanti errori su Mi piace di Unix se usi il -static segnala su GCC, come avviene su Windows.

Altri suggerimenti

Tramite questo post della mailing list SDL sembra che gli strumenti di sviluppo di sdl siano forniti con uno script sdl-config che puoi usare con il flag --static-libs per determinare quali flag di linker devi usare.

Ambiente: macchina virtuale VMWare con Windows 7 x64 e apparecchiature sviluppate c + + build 7.4.2.569, complilador g + + (tdm-1) 4.6.1

Una volta, l'API SDL2-2.0.3 installata come configurazione Dev c ++ non è molto chiara su ciò che ho fatto come tradizione richiede la riga di comando.

Il primo problema è che Windows 7 sembra aver cambiato la metodologia e vanno alla sua palla. Inventario. Ref. https://stackoverflow.com/users/464581/cheers-and-hth-alf

Dopo il primo ostacolo, SDL_platform.h è così male, è un altro, non ricordo dove ho scaricato, ma il successivo non funziona nella versione indicata.

Dobbiamo inserire SDL2.h ls nella directory dell'eseguibile.

D: \ prg_desa \ zsdl2 > g ++ bar.cpp main.cpp -o pepe1 -ID: \ SDL2-2.0.3 \ i686-w64-mingw32 \ include \ SDL2 -LD: \ SDL2-2.0. 3 \ i686-w64-mingw32 \ lib -lmingw32 -lSDL2main -lSDL2 -mwindow

Ho finalmente compilato e funziona test SDL2.

Questo perché le librerie SDL sono sotto licenza LGPL.

Se vuoi collegare staticamente le librerie (puoi farlo se le ricompili. Tuttavia ha bisogno di un po 'di hacking nei makefile) devi posizionare il tuo gioco anche con una licenza open source compatibile.

Le librerie SDL vengono fornite come librerie condivise perché la maggior parte dei programmi che le usano sono di tipo chiuso. La distribuzione binaria si presenta in una forma di cui la maggior parte delle persone ha bisogno.

Sul mio sistema (Ubuntu) devo usare i seguenti flag:

-Wl,Bstatic -lSDL_image `sdl-config --libs` -lpng12 -lz -ltiff -ljpeg -lasound -laudio -lesd -Wl,-Bdynamic `directfb-config --libs` -lpulse-simple -lcaca -laa -ldl

Che collega SDL, SDL _ e molte delle loro dipendenze come statiche. libdl non vuoi mai essere statico, quindi creare un binario completamente statico che usi l'immagine _ SDL è una cattiva idea. pulse, caca, aa e directfb probabilmente possono essere resi statici. Non sono ancora abbastanza lontano per capirli ancora.

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