Как статически скомпилировать игру SDL в Windows

Я пытаюсь создать статически связанную "одиночную двоичную" версию моей игры для windows. Я хочу связать с SDL, sdl_image и sdl_mixer, которые в свою очередь тянут в несколько библиотек. К сожалению, я не нашел способ заставить их все скомпилировать и связать с помощью cygwin/mingw/gcc. Насколько я могу судить, все существующие общедоступные версии-это только общие библиотеки / DLL.

обратите внимание, что я не говорю здесь О лицензировании. Источник будет открыт, таким образом, GPL / LGPLness sdl не актуален.

5 ответов


при компиляции вашего проекта вам нужно внести всего пару изменений в ваш makefile.

  • вместо sdl-config --libs используйте sdl-config --static-libs
  • окружите использование вышеупомянутого sdl-config --static-libs С -Wl,-Bstatic и -Wl,-Bdynamic. Это говорит GCC о принудительном статическом связывании, но только для библиотек, указанных между ними.

если ваш makefile в настоящее время выглядит так:

SDLLIBS=`sdl-config --libs`

меняем его на:

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

это на самом деле то же самое, что и ты!--21-->должны do в Unix-подобных системах, но обычно это не вызывает столько ошибок в Unix-подобных, если вы используете более простой -static флаг для GCC, как и в Windows.


через сообщение списка рассылки SDL Кажется, что инструменты разработки sdl поставляются со скриптом sdl-config, который вы можете использовать с флагом --static-libs, чтобы определить, какие флаги компоновщика вам нужно использовать.


окружающая среда: виртуальная машина VMWare с Windows 7 x64 и оборудованием мы Dev c + + build 7.4.2.569, complilador g+ + (tdm-1) 4.6.1

однажды SDL2-2.0.3 API, установленный как configuration Dev c ++, не очень ясно, что я сделал, поскольку традиция требует командной строки.

первая проблема заключается в том, что Windows 7, похоже, изменила методологию, и они идут на его мяч. Инвентаризация. Ссылка. https://stackoverflow.com/users/464581/cheers-and-hth-alf

после первого препятствия SDL_platform.h это плохо, это вниз другой, я не помню, где я скачал, но следующий не работает в указанной версии.

мы должны поставить SDL2.h ls в каталоге исполняемого файла.

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

Я, наконец, скомпилировал и работает SDL2 тестирование.


Это потому, что библиотеки SDL находятся под лицензией LGPL.

Если вы хотите статически связать библиотеки (вы можете сделать это, если перекомпилируете их. Он нуждается в некотором взломе makefiles, хотя) вы должны разместить свою игру под какой-то совместимой лицензией с открытым исходным кодом.

SDL-libs поставляются как общие библиотеки, потому что большинство программ, которые их используют, являются закрытыми исходными кодами. Двоичное распределение поставляется в форме, которая нужна большинству людей.


на моей системе (Ubuntu), я должен использовать следующие флаги:

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

это связывает SDL, SDL_image и многие из их зависимостей как статические. libdl вам никогда не нужен статический, поэтому сделайте полностью статический двоичный файл, который использует SDL_изображение-плохая идея. pulse,caca, aa и directfb, вероятно, могут быть сделаны статическими. Я еще не достаточно далеко продвинулся, чтобы понять их.