Как статически скомпилировать игру SDL на Windows - PullRequest
14 голосов
/ 22 сентября 2008

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

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

Ответы [ 5 ]

22 голосов
/ 08 февраля 2009

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

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

Если ваш make-файл в данный момент выглядит так:

SDLLIBS=`sdl-config --libs`

Измените его на:

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

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

2 голосов
/ 04 февраля 2009

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

1 голос
/ 11 мая 2014

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

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

Первая проблема заключается в том, что Windows 7, похоже, изменила методологию, и они пошли ему навстречу. Inventory. Ссылка 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.

0 голосов
/ 13 сентября 2009

В моей системе (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 _ и многие их зависимости как статические. В libdl вы никогда не захотите использовать static, поэтому создание полностью статического двоичного файла, использующего изображение SDL _, - плохая идея. pulse, caca, aa и directfb, вероятно, можно сделать статическими. У меня еще недостаточно места, чтобы понять их.

0 голосов
/ 22 сентября 2008

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

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

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

...