views:

2045

answers:

4

I have been trying to produce a statically linked "single binary" version of my game for windows. I want to link with sdl, sdl_image and sdl_mixer which in turn pull in a few support libraries. Unfortunately I haven't found a way to get them all to compile and link using cygwin/mingw/gcc. As far as I can tell all existing public versions are only shared libraries / dlls.

Please note that I'm not talking about licencing here. The source will be open thus the GPL/LGPLness of sdl is not relevant.

A: 

That's because the SDL libs are under the LGPL-license.

If you want to static link the libs (you can do that if your recompile them. It needs some hacking into the makefiles though) you have to place your game under some compatible open source license as well.

The SDL-libs come as shared libraries because most programs that use them are closed source. The binary distribution comes in a form that most people need.

Nils Pipenbrinck
LGPL is a very permissive license and does allow static inclusion in closed source apps. It's the GPL that doesn't allow inclusion in closed source apps except with the dll type inclusion.
KPexEA
afaik GPL does not allow any kind of linking with closed source. LGPL allows dynamic linking (Users must be able to update/change the LGPL-code). Static linking with LGPL in a closed source software is a no-no.
Nils Pipenbrinck
As long as you provide customers with the facility to re-link to LGPL libraries if they wish, you can provide statically linked binaries. You must also include the LGPL and state that the library used falls under this licence.
Artelius
+2  A: 

Via this SDL mailing list post it seems that the sdl development tools ship with a sdl-config script that you can use with the --static-libs flag to determine what linker flags you need to use.

David Locke
+7  A: 

When compiling your project, you need to make just a couple changes to your makefile.

  • Instead of sdl-config --libs, use sdl-config --static-libs
  • Surround the use of the above-mentioned sdl-config --static-libs with -Wl,-Bstatic and -Wl,-Bdynamic. This tells GCC to force static linking, but only for the libraries specified between them.

If your makefile currently looks like:

SDLLIBS=`sdl-config --libs`

Change it to:

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

These are actually the same things you should do on Unix-like systems, but it usually doesn't cause as many errors on Unix-likes if you use the simpler -static flag to GCC, like it does on Windows.

Alex Lyman
I'm marking this as the answer because it seems like the best Answer. Yet I still can't get it to work as I'm getting loads of "undefined reference" to functions like _waveOutOpen@24 or _timeGetTime@0.
Sec
A: 

On my system (Ubuntu) I have to use the following flags:

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

That links SDL, SDL_image, and many of their dependencies as static. libdl you never want static, so making a fully-static binary that uses SDL_image is a poor idea. pulse,caca,aa, and directfb can probably be made static. I haven't got far enough to figure them out yet.

singpolyma