2008-09-22 27 views
14

He intentado producir una versión estática de mi juego "enlazada estáticamente" para Windows. Quiero vincular con sdl, sdl_image y sdl_mixer, que a su vez extraen algunas bibliotecas de soporte. Desafortunadamente, no he encontrado una manera de hacer que todos compilen y vinculen usando cygwin/mingw/gcc. Por lo que puedo decir, todas las versiones públicas existentes son solo bibliotecas/dlls compartidas.Cómo compilar estáticamente un juego SDL en Windows

Tenga en cuenta que no estoy hablando de licencias aquí. La fuente estará abierta, por lo tanto, la GPL/LGPLness de sdl no es relevante.

+0

No quería ser la respuesta aceptada por incompletitud :(. Si puede proporcionar más información (como el resultado de las llamadas sdl-config, y una lista de los errores del enlazador), estoy dispuesto a intentarlo para arreglar mi respuesta –

+0

sdl --static-libs returns: "-L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mno-cygwin -mwindows" que me parece correcto. Cualquier otra información que pueda dar – Sec

Respuesta

21

Al compilar su proyecto, necesita hacer solo un par de cambios en su archivo MAKE.

  • En lugar de sdl-config --libs, utilice sdl-config --static-libs
  • Surround el uso de la mencionada sdl-config --static-libs con -Wl,-Bstatic y -Wl,-Bdynamic. Esto le dice a GCC que fuerce los enlaces estáticos, pero solo para las bibliotecas especificadas entre ellos.

Si su makefile actualmente se ve así:

SDLLIBS=`sdl-config --libs` 

Cambiar a:

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

Estas son en realidad las mismas cosas que debe hacer en los sistemas de tipo Unix, pero por lo general, no causa tantos errores en Unix-likes si usa el indicador -static más simple para GCC, como lo hace en Windows.

+0

Estoy marcando esto como la respuesta porque parece ser la mejor respuesta. Sin embargo, todavía no puedo hacer que funcione ya que estoy recibiendo mucha "referencia indefinida" para funciones como _waveOutOpen @ 24 o _timeGetTime @ 0. – Sec

+0

@Sec esos son los requisitos introducidos porque la biblioteca estática de SDL los usa. La biblioteca multimedia de WInMM y algunas otras probablemente tendrán que ser agregadas a su línea de enlace. – WhozCraig

0

Eso es porque las librerías SDL están bajo la licencia LGPL.

Si desea vincular estáticamente las librerías (puede hacerlo si las vuelve a compilar, aunque necesita algunos hacks en los archivos make), también debe colocar su juego bajo alguna licencia de código abierto compatible.

SDL-libs vienen como bibliotecas compartidas porque la mayoría de los programas que las usan son de código cerrado. La distribución binaria viene en una forma que la mayoría de la gente necesita.

+1

LGPL es una licencia muy permisiva y permite la inclusión estática en aplicaciones de código cerrado. Es la GPL que no permite la inclusión en aplicaciones de código cerrado, excepto con la inclusión de tipo dll – KPexEA

+0

afaik GPL no permite ningún tipo de enlace con fuente cerrada. LGPL permite la vinculación dinámica (los usuarios deben ser capaces de actualizar/cambiar el código LGPL). Enlace estático con LGPL en una fuente cerrada s oftware es un no-no. –

+3

Siempre que proporcione a los clientes la posibilidad de volver a vincularse a las bibliotecas LGPL si lo desean, puede proporcionar binarios enlazados estáticamente. También debe incluir la LGPL e indicar que la biblioteca utilizada cae bajo esta licencia. – Artelius

2

A través de este SDL mailing list post parece que las herramientas de desarrollo de sdl se envían con un script sdl-config que puede usar con el indicador --static-libs para determinar qué indicadores del enlazador necesita usar.

0

En mi sistema (Ubuntu) Tengo que usar las siguientes banderas:

-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 los vínculos SDL, SDL imagen _, y muchas de sus dependencias como estática. libdl nunca desea estática, por lo que crear una imagen binaria completamente estática que use SDL _ es una mala idea. pulse, caca, aa y directfb probablemente pueden estar estáticos. Todavía no he llegado lo suficiente como para descubrirlos.

1

Medio Ambiente: VMWare máquina virtual con Windows 7 x64 y equipo que Dev C + + construir 7.4.2.569, complilador g + + (TDM-1) 4.6.1

vez, API SDL2-2.0.3 instalado como configuración Dev C++ no es muy claro lo que he hecho ya que la tradición requiere línea de comandos.

El primer problema es que Windows 7 parece haber cambiado la metodología y van a su bola.Inventario. Árbitro. https://stackoverflow.com/users/464581/cheers-and-hth-alf

Después del primer obstáculo, SDL_platform.h es tan malo, está abajo de otro, no recuerdo dónde lo descargué, pero el siguiente no funciona en la versión indicada.

Debemos poner SDL2.h ls en el directorio del ejecutable.

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

finalmente he compilado y funciona las pruebas SDL2.

+0

Aquí tienes las fuentes: bar.cpp #undef UNICODE, UNICODE #define, # include , # include , incluyen , using namespace std; , int wmain (int argc, wchar_t * argv []), {wostringstream text; texto << argc-1 << L "argumentos de la línea de comando: \ n"; for (int i = 1; i

+0

main.cpp # include #include #include # include using namespace std; int main (int argc, char * argv []) {pantalla SDL_Surface *; evento SDL_Event; if (SDL_Init (SDL_INIT_VIDEO) == - 1) {SDL_GetError()); return 1;} MessageBox (0, TEXT ("Pulsa el OK"), TEXTO ("Hola"), MB_SETFOREGROUND); while (evento SDL_WaitEvent)) {if (event.type == SDL_QUIT) break; } SDL_Quit(); return 0;} –

Cuestiones relacionadas