Como compilar estaticamente um jogo SDL no Windows
Pergunta
Eu tenho tentado para produzir uma versão estaticamente ligado "único binário" do meu jogo para Windows. Eu quero vincular com SDL, SDL_image e SDL_mixer que por sua vez força em algumas bibliotecas de apoio. Infelizmente eu não encontrei uma maneira de levá-los todos para compilar e link usando cygwin / mingw / gcc. Tanto quanto eu posso dizer todas as versões públicas existentes apenas são compartilhadas bibliotecas / dlls.
Por favor note que eu não estou falando sobre o licenciamento aqui. A fonte será aberto assim a GPL / LGPLness da SDL não é relevante.
Solução
Ao compilar seu projeto, você precisa fazer apenas algumas alterações em seu makefile.
- Em vez de
sdl-config --libs
, usosdl-config --static-libs
- Surround o uso do
sdl-config --static-libs
acima mencionado com-Wl,-Bstatic
e-Wl,-Bdynamic
. Isto diz GCC para forçar vinculação estática, mas apenas para as bibliotecas especificadas entre eles.
Se o seu makefile parece atualmente como:
SDLLIBS=`sdl-config --libs`
mude para:
SDLLIBS=-Wl,-Bstatic `sdl-config --static-libs` -Wl,-Bdynamic
Estes são realmente as mesmas coisas que você deve fazer em Unix-like sistemas, mas normalmente não causa tantos erros no Unix-gosta, se você usar o sinalizador -static
simples de GCC, como ele faz no Windows.
Outras dicas
Por isso SDL lista de discussão pós parece que as ferramentas de desenvolvimento sdl fornecido com um script sdl-config que você pode usar com a bandeira --static-libs para determinar o que bandeiras vinculador que você precisa para uso.
Ambiente: VMWare máquina virtual com Windows 7 x64 e equipamento que Dev c + + compilação 7.4.2.569, g complilador + + (TDM-1) 4.6.1
Uma vez, SDL2-2.0.3 API instalado como configuração Dev c ++ não é muito claro o que eu fiz como a tradição exige linha de comando.
O primeiro problema é que o Windows 7 parece ter mudado a metodologia e eles vão para a sua bola. Inventário. Ref. https://stackoverflow.com/users/464581/cheers-and-hth-alf
Depois do primeiro obstáculo, SDL_platform.h é tão ruim, que é baixo o outro, eu não me lembro onde eu baixei, mas o próximo não funciona na versão indicada.
Devemos colocar ls SDL2.h no diretório do executável.
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
Eu finalmente compilado e funciona testes SDL2.
Isso porque as bibliotecas SDL estão sob a LGPL-licença.
Se você quiser vínculo estático as libs (você pode fazer isso se o seu recompilação-los. É preciso algum invadir os makefiles embora) você tem que colocar o seu jogo sob alguma licença de código aberto compatível também.
Os SDL-libs vir como bibliotecas compartilhadas porque a maioria dos programas que os utilizam são de código fechado. A distribuição binária vem em uma forma que a maioria das pessoas precisa.
No meu sistema (Ubuntu) eu tenho que usar as seguintes bandeiras:
-Wl,Bstatic -lSDL_image `sdl-config --libs` -lpng12 -lz -ltiff -ljpeg -lasound -laudio -lesd -Wl,-Bdynamic `directfb-config --libs` -lpulse-simple -lcaca -laa -ldl
que liga SDL, SDL_
image, e muitas de suas dependências como estático. libdl você nunca quer estática, de modo a fazer um binário totalmente estática que utiliza SDL_
image é uma má idéia. pulso, caca, aa, e directfb provavelmente pode ser feita estática. Eu não tenho o suficiente para entendê-los ainda.