2.3. Компиляция и установка библиотек SDL-окружения
По своей структуре библиотека SDL не является полноценным SDK (Software Development Kit) для разработчиков игр, так как не включает в себя высокоуровневые функции для работы с графикой, звуком и внешними устройствами. Но благодаря тому, что она предоставляет прямой доступ к графической системе, звуковой карте, устройствам ввода (клавиатуре, мыши, джойстику), CD-ROM’ому, таймеру и в ней реализованы некоторые низкоуровневые функции для работы с графикой и звуком, библиотеку вполне можно использовать для разработки не слишком сложных приложений или портирования существующих, где SDL библиотека будет использоваться как блиттер. В библиотеке реализован только минимум необходимых функций, она не раздута на десятки мегабайт и достаточно быстра. По своей сути SDL является каркасом для других библиотек, которые поддерживают более сложные функции в какой-то одной области (графика, микширование звука, поддержка различных форматов файлов, GUI и. т. д). И уже вместе с этими дополнительными библиотеками SDL и образует достаточно многофункциональный, хоть и уже устаревший, SDK для разработчиков игр.
В этом разделе я рассмотрю сборку частоиспользуемых библиотек SDL. Некоторые из них поддерживаются официально, некоторые поддерживаются сторонними разработчиками. Собраное SDL-окружение для MinGW позволит вам легко перенести множество игр на платформу Windows.
2.3.1. Компиляция и установка основной библиотеки SDL
Описание:
Официальный сайт: http://www.libsdl.org/
Библиотека Simple DirectMedia Layer (SDL) реализует единый программный интерфейс к графической подсистеме, звуковым устройствам и средствам ввода для широкого спектра платформ. Она активно используется при написании мультимедийных программ: игр, эмуляторов или плееров, и является этаким подобием “DirectX” для огромного количества платформ. Более подробно про эту библиотеку можно прочитать здесь: Низкоуровневое расширение библиотеки SDL.
Сборка:
2.3.1.1. Скачиваем последнюю версию исходников библиотеки SDL с официального сайта, на момент написания статьи это 1.2.15: SDL-1.2.15.tar.gz
2.3.1.2. Распаковываем архив в папку “C:\Qt\build\SDL”, исходники библиотеки должны быть в папке “C:\Qt\build\SDL\SDL-1.2.15”.
2.3.1.3. Компилируем и устанавливаем SDL-библиотеку:
Запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL/SDL-1.2.15 ./configure --prefix=/mingw make make install
Библиотека скомпилировалась с дефолтными параметрами. Если вам нужны какие-то специальные параметры, то их всегда можно изменить перед конфигурированием. Список доступных опций можно посмотреть выполнив команду
./configure --help
Например, опция “–enable-stdio-redirect=no” отключает файлы “stdout.txt” и “stderr.txt”, которые создаются при запуске программы, и направляет вывод в консольное окно.
2.3.1.4. Скомпилированные статическая и динамическая библиотеки, заголовочные файлы должны скопироваться в соответствующие папки:
Динамическая “SDL.dll” в “C:\Qt\MinGW\bin”
Статические “libSDL.a”, “libSDL.dll.a” и “libSDLmain.a” в “C:\Qt\MinGW\lib”
Хэдеры в “C:\Qt\MinGW\include\SDL”
2.3.1.5. Запуск и компиляция небольшого демо-кода:
Создаем файл “sdldemo.c” в папке “C:\Qt\build\SDL” с таким содержимым:
#include <SDL/SDL.h> #include <SDL/SDL_opengl.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.5f, 0.0f); glBegin(GL_TRIANGLES); glVertex2f(-1.0, -1.0); glVertex2f(0, 1.0); glVertex2f(1.0, -1.0); glEnd(); glFlush(); SDL_GL_SwapBuffers(); } void SDL_Loop() { Uint8 *keys; int done = 0; while (!done) { SDL_Event event; display(); while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: done = 1; break; } } keys = SDL_GetKeyState(NULL); if (keys[SDLK_ESCAPE]) done = 1; } } int main(int argc, char *argv[]) { SDL_Surface *screen; SDL_Init(SDL_INIT_VIDEO); screen = SDL_SetVideoMode(200, 200, 16, SDL_OPENGL); SDL_Loop(); SDL_Quit(); return 0; }
и сохраняем.
Для компиляции и запуска кода запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL gcc -mwindows sdldemo.c -o sdldemo -lmingw32 -lSDLmain -lSDL -lopengl32 ./sdldemo.exe
Приложение “sdldemo.exe” создаст простое и небольшое окно с оранжевым треугольником в центре:

2.3.2. Компиляция и установка библиотеки SDL_image
Описание:
Официальный сайт: http://www.libsdl.org/projects/SDL_image/
Библиотека SDL_image является расширением основной библиотеки SDL и позволяет использовать в SDL-приложениях различные форматы изображений, не ограничиваясь форматом “*.bmp”. SDL_image позволяет программистам легко использовать несколько форматов без необходимости написания функций загрузки и преобразования.
Сборка:
Внимание! Зависимости:
Библиотека zlib
Библиотека JPEG
Библиотека PNG
Библиотека TIFF (Опционально. Я не использовал, так как ничтожно малое количество проектов использует формат изображений “*.tiff”).
Перед компиляцией библиотеки скомпилируйте и установите все зависимости!
2.3.2.1. Скачиваем последнюю стабильную версию исходников библиотеки SDL_image, на момент написания статьи последняя версия 1.2.12: SDL_image-1.2.12.tar.gz
2.3.2.2. Распаковываем скачанный архив в папку “C:\Qt\build\SDL”, исходники библиотеки должны быть в папке “C:\Qt\build\SDL\SDL_image-1.2.12”.
2.3.2.3. Компилируем и устанавливаем библиотеку SDL_image:
Запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” или ConEmu и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL/SDL_image-1.2.12 ./configure --prefix=/mingw make make install
Библиотека скомпилировалась с дефолтными параметрами. Если вам нужны какие-то специальные параметры, то их всегда можно изменить перед конфигурированием. Список доступных опций можно посмотреть выполнив команду
./configure --help
2.3.2.4. Скомпилированные статическая и динамическая библиотеки, заголовочные файлы должны скопироваться в соответствующие папки:
Динамическая библиотека “SDL_image.dll” в “C:\Qt\MinGW\bin”
Статическая “libSDL_image.a” в “C:\Qt\MinGW\lib”
Хэдеры в “C:\Qt\MinGW\include\SDL”
2.3.2.5. На этом установка завершена. При желании можно скомпилировать утилиту “showimage.exe”:
cd /c/Qt/build/SDL/SDL_image-1.2.12 gcc showimage.c -o showimage -I/mingw/include/SDL -lmingw32 -lSDLmain -lSDL -lSDL_image -mwindows
Если на “showimage.exe” перетащить любое изображение – оно откроется в окне.
2.3.3. Компиляция и установка библиотеки SDL_net
Описание:
Официальный сайт: http://www.libsdl.org/projects/SDL_net/
Сетевая библиотека SDL_net является расширением основной библиотеки SDL и позволяет использовать в SDL-приложениях сеть. SDL_net позволяет программистам легко обработавать сетевые соединения и передачу данных. Код, написанный с использованием функций из этой библиотеки, будет кроссплатформенным.
Сборка:
2.3.3.1. Скачиваем последнюю стабильную версию исходников библиотеки SDL_net, на момент написания статьи последняя версия 1.2.8: SDL_net-1.2.8.tar.gz
2.3.3.2. Распаковываем скачанный архив в папку “C:\Qt\build\SDL”, исходники библиотеки должны быть в папке “C:\Qt\build\SDL\SDL_net-1.2.8”.
2.3.3.3. Компилируем и устанавливаем библиотеку SDL_net:
Запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” или ConEmu и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL/SDL_net-1.2.8 ./configure --prefix=/mingw make make install
Библиотека скомпилировалась с дефолтными параметрами. Если вам нужны какие-то специальные параметры, то их всегда можно изменить перед конфигурированием. Список доступных опций можно посмотреть выполнив команду
./configure --help
2.3.3.4. Скомпилированные статическая и динамическая библиотеки, заголовочные файлы должны скопироваться в соответствующие папки:
Динамическая библиотека “SDL_net.dll” в “C:\Qt\MinGW\bin”
Статическая “libSDL_net.a” в “C:\Qt\MinGW\lib”
Хэдер “SDL_net.h” в “C:\Qt\MinGW\include\SDL”
2.3.4. Компиляция и установка библиотеки SDL_gfx
Описание:
Официальный сайт: http://www.ferzkopp.net/joomla/content/view/19/14/
Библиотека SDL_gfx содержит в себе функции рисования примитивов и работы над изображениями-спрайтами (масштабирование, повороты, фильтры и т.д). Она развились из проекта SDL_gfxPrimitives, который представлял основные процедуры рисования примитивов, таких как: линии, окружности и многоугольники. Библиотека не относится к официальным, но большое количество проектов ее используют.
Сборка:
2.3.4.1. Скачиваем последнюю стабильную версию исходников библиотеки SDL_gfx, на момент написания статьи последняя версия 2.0.24: SDL_gfx-2.0.24.tar.gz
2.3.4.2. Распаковываем скачанный архив в папку “C:\Qt\build\SDL”, исходники библиотеки должны быть в папке “C:\Qt\build\SDL\SDL_gfx-2.0.24”.
2.3.4.3. Компилируем и устанавливаем библиотеку SDL_gfx:
Запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” или ConEmu и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL/SDL_gfx-2.0.24 ./configure --prefix=/mingw make make install
Если при компиляции возникла ошибка:
libtool: Version mismatch error. This is libtool 2.4.2, but the libtool: definition of this LT_INIT comes from libtool 2.4. libtool: You should recreate aclocal.m4 with macros from libtool 2.4.2 libtool: and run autoconf again. make: *** [SDL_gfxPrimitives.lo] Error 63
Выполните команду:
autoreconf -fvi
И повторите конфигурирование, а затем компиляцию.
Библиотека скомпилировалась с дефолтными параметрами. Если вам нужны какие-то специальные параметры, то их всегда можно изменить перед конфигурированием. Список доступных опций можно посмотреть выполнив команду
./configure --help
2.3.4.4. Скомпилированные статическая и динамическая библиотеки, заголовочные файлы должны скопироваться в соответствующие папки:
Динамическая библиотека “libSDL_gfx-14.dll” в “C:\Qt\MinGW\bin”
Статическая “libSDL_gfx.a” и “libSDL_gfx.dll.a” в “C:\Qt\MinGW\lib”
Хэдеры в “C:\Qt\MinGW\include\SDL”
2.3.4.5. На этом установка завершена. При желании можно скомпилировать утилиту “TestGfxTexture.exe”:
cd /c/Qt/build/SDL/SDL_gfx-2.0.24/Test gcc TestGfxTexture.c -o TestGfxTexture -I/mingw/include/SDL -lmingw32 -lSDLmain -lSDL -lSDL_gfx -mwindows ./TestGfxTexture
При запуске откроется окно, показывающее результат текстурирования.
2.3.5. Компиляция и установка библиотеки SDL_ttf 2.0
Описание:
Официальный сайт: http://www.libsdl.org/projects/SDL_ttf/
SDL_ttf 2.0 представляет собой библиотеку отрисовки шрифтов TrueType, и используется вместе с библиотекой SDL. Это позволяет программистам использовать шрифты TrueType без написания собственного рендера шрифта. Благодаря функциям масштабирования шрифтов и антиалиасинга можно получить высокое качество вывода текста без особых усилий.
Сборка:
Внимание! Зависимости:
Библиотека FreeType 2
Перед компиляцией библиотеки скомпилируйте и установите все зависимости!
2.3.5.1. Скачиваем последнюю стабильную версию исходников библиотеки SDL_ttf 2.0, на момент написания статьи последняя версия 2.0.11: SDL_ttf-2.0.11.tar.gz
2.3.5.2. Распаковываем скачанный архив в папку “C:\Qt\build\SDL”, исходники библиотеки должны быть в папке “C:\Qt\build\SDL\SDL_ttf-2.0.11” .
2.3.5.3. Компилируем и устанавливаем библиотеку SDL_ttf 2.0:
Запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” или ConEmu и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL/SDL_ttf-2.0.11 ./configure --prefix=/mingw make make install
Библиотека скомпилировалась с дефолтными параметрами. Если вам нужны какие-то специальные параметры, то их всегда можно изменить перед конфигурированием. Список доступных опций можно посмотреть выполнив команду
./configure --help
2.3.5.4. Скомпилированные статическая и динамическая библиотеки, заголовочные файлы должны скопироваться в соответствующие папки:
Динамическая библиотека “SDL_ttf.dll” в “C:\Qt\MinGW\bin”
Статическая “libSDL_ttf.a” и остальные в “C:\Qt\MinGW\lib”
Хэдеры в “C:\Qt\MinGW\include\SDL”
2.3.5.5. На этом установка завершена. При желании можно скомпилировать утилиту “showfont.exe”:
cd /c/Qt/build/SDL/SDL_ttf-2.0.11 gcc showfont.c -o showfont -I/mingw/include/SDL -lmingw32 -lSDLmain -lSDL -lSDL_ttf
Если на “showfont.exe” перетащить любой “*.ttf” шрифт – он откроется в окне.
2.3.6. Компиляция и установка библиотеки SDL_mixer
Описание:
Официальный сайт: http://www.libsdl.org/projects/SDL_mixer/
SDL_mixer это библиотека микширования звука, которая может использоваться вместе с библиотекой SDL. Она позволяет программистам использовать звуки вместе с музыкой и не писать собственные микшеры. Библиотека также упрощает загрузку, обработку и воспроизведения звуков и музыки всевозможных форматов файлов, в собираемой нами конфигурации библиотека сможет поддерживать такие форматы как “*.mp3”, “*.ogg”, “*.flac”, “*.mod” и несколько других.
Сборка:
Внимание! Зависимости:
Библиотека SDL
Библиотека OGG
Библиотека OggVorbis (libVorbis)
Библиотека FLAC
Библиотека MikMod
Библиотека MAD (libmad)
Перед компиляцией библиотеки скомпилируйте и установите все зависимости!
2.3.6.1. Скачиваем последнюю стабильную версию исходников библиотеки SDL_mixer, на момент написания статьи последняя версия 1.2.12: SDL_mixer-1.2.12.tar.gz
2.3.6.2. Распаковываем скачанный архив в папку “C:\Qt\build\SDL”, исходники библиотеки должны быть в папке “C:\Qt\build\SDL\SDL_mixer-1.2.12”.
2.3.6.3. Открываем файл “C:\Qt\build\SDL\SDL_mixer-1.2.12\Makefile.in” и заменяем одинаковые строки #69 и #72:
$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET)
на строку
$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS)
после замены сохраняем файл.
2.3.6.4. Компилируем и устанавливаем библиотеку SDL_mixer:
Запускаем “C:\Qt\MinGW\msys\1.0\msys.bat” или ConEmu и набираем в консольном окне такие команды:
cd /c/Qt/build/SDL/SDL_mixer-1.2.12 ./configure --enable-music-mp3-mad-gpl --disable-music-mp3 --disable-music-fluidsynth-midi --prefix=/mingw make make install
Настоятельно рекомендую использовать декодер MAD, вместо нестабильного и старого smpeg. Если у вас в процессе конфигурирования не подцепляется FLAC, попробуйте сначала ввести строчку:
export LIBS="-L/mingw/lib -logg -lws2_32"
А потом уже выполнять конфигурирование. Без этой строки “conftest.c” может не слинковаться. После компиляции не забудьте выполнить:
export -n LIBS
Чтобы очистить переменную окружения LIBS.
Если вам нужны какие-то специальные параметры, то их всегда можно изменить перед конфигурированием. Список доступных опций можно посмотреть выполнив команду
./configure --help
2.3.6.5. Скомпилированные статическая и динамическая библиотеки, заголовочные файлы должны скопироваться в соответствующие папки:
Динамическая библиотека “SDL_mixer.dll” в “C:\Qt\MinGW\bin”
Статическая “libSDL_mixer.a” и остальные в “C:\Qt\MinGW\lib”
Хэдер “SDL_mixer.h” в “C:\Qt\MinGW\include\SDL”
2.3.6.6. В комментариях обнаружилась интересная ошибка на стадии линковки, при компилировании библиотеки SDL_mixer компилятором MinGW (GCC 4.7.2). Ошибка возникала из-за того, что libtool, используевшийся для компиляции в SDL_mixer не мог подлинковать библиотеку libpthread, отвечающую за потоки и нужную для дефолтного конфигурирования libmikmod. В данном блоке показана последовательность действий, выполнив которые вы сохраните многопоточность библиотеки libmikmod и сможете скомпилировать и установить библиотеку SDL_mixer.
Все действия актуальны на момент написания этого блока (04.06.2012).
Все библиотеки в зависимостях, кроме MikMod, конфигурируются, компилируются и устанавливаются стандартно.
Библиотека “libmikmod-3.2.0” конфигурируется теперь так:
export CFLAGS="-march=native" ./configure --prefix=/mingw make make install export -n CFLAGS
И, наконец, библиотека “SDL_mixer-1.2.12” компилируется так:
2.3.6.6.1. Открываем файл “C:\Qt\build\SDL\SDL_mixer-1.2.12\Makefile.in” и заменяем строки #26, #69 и #72 на следующие,
LDFLAGS = -pthread @BUILD_LDFLAGS@ $(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS) $(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS)
сохраняя порядок соответственно.
Затем обычное конфигурирование и компиляция:
./configure --enable-music-mp3-mad-gpl --disable-music-mp3 --disable-music-fluidsynth-midi --prefix=/mingw make make install
Стоит заметить, что теперь приложения, использующие SDL_mixer будут еще требовать и библиотеку “pthreadGC2.dll”. В комментариях есть примеры сборок SDL_mixer без libmikmod’a или с libmikmod’ом, но без потоков.
2.3.6.7. На этом установка завершена. Для проверки правильности работы библиотеки можно скомпилировать простейший плеер “sdlwav.exe”. Для этого нужно скачать файл “sdlwav.c“, сохранить его в папку “C:\Qt\build\SDL” и скомпилировать его следующим образом:
cd /c/Qt/build/SDL gcc sdlwav.c -o sdlwav -I/mingw/include/SDL -lmingw32 -lSDLmain -lSDL -lSDL_mixer
Теперь если на “sdlwav.exe” перетащить любой файл, содержащий музыку или звук в формате “*.mp3”, “*.flac”, “*.ogg”, “*.wav” или “*.mod” – он должен воспроизвестись, помимо этого должно открыться окно простенького визуализатора, если окно с ним активно то можно перемотать трек стрелками на клавиатуре или поставить его на паузу пробелом.

После запуска в файле “stdout.txt” (он будет рядом с “sdlwav.exe”), или в выводе консоли будут показаны доступные декодеры и их количество. Для нашей конфигурации SDL_mixer получился следующий лог:
Before Mix_Init SDL_mixer supported: None After Mix_Init SDL_mixer supported: FLAC MOD OGG There are 5 available chunk(sample) decoders: WAVE AIFF VOC OGG FLAC There are 6 available music decoders: WAVE MIKMOD NATIVEMIDI OGG FLAC MP3 Opened audio at 44100 Hz 16 bit stereo, 1024 bytes audio buffer Music type: MUS_MP3_MAD
http://exlmoto.ru/mingw-development-environment/