한국어
오픈소스포럼
 이곳은 다양한 오픈소스 프로젝트를 소개하고 리뷰, 활용 방법을 공유합니다.

Simple DirectMedia Layer 이하 SDL은 OpenGL 및 Direct3D를 통해 오디오, 키보드, 마우스, 조이스틱 및 그래픽 하드웨어에 대한 저수준 액세스를 제공하도록 설계된 크로스 플랫폼 개발 라이브러리다. 

SDL은 1.x버전대와 2.x 버전대가 각각 공존하여 둘 다 사용되는데 라이센스가 다르다. SDL 1.2의 라이센스는 LGPL이고 SDL 2.0 이상은 zlib 라이센스에 따라 사용할 수 있다.

 

리눅스에서 apt를 이용하면 SDL2 패키지를 쉽게 설치 할 수 있지만 이 글은 최신 소스코드를 직접 컴파일 후 Qt Creator로 개발하는 방법을 설명한다.

 

OS: 우분투 18.04

IDE: Qt Creator 4.10

 

필수 패키지 설치

$ sudo apt update

$ sudo apt install build-essential pkg-config libgl1-mesa-dev

 

Qt 및 Qt Creator의 설치 방법은 다음 글을 참고: https://makersweb.net/qt/963

 

SDL2 소스코드 다운로드와 컴파일 및 설치

https://www.libsdl.org를 방문하면 최신 소스코드를 다운로드받을 수 있다.

sdl2.0.10.png

 

wget명령으로 소스코드 다운로드를 쉽게 할 수 있다.

$ wget https://www.libsdl.org/release/SDL2-2.0.10.tar.gz

$ tar xvf SDL2-2.0.10.tar.gz

$ cd SDL2-2.0.10

$ ./configure

 

다음은 필자의 SDL2 Configure Summary 이다. Video drivers의 내용이 다음과 비슷해야한다.

SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic sensor power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   : mmx 3dnow sse sse2 sse3
Audio drivers   : disk dummy oss
Video drivers   : dummy x11(dynamic) opengl opengl_es2 vulkan
X11 libraries   : xdbe xshape xvidmode
Input drivers   : linuxev linuxkd
Using libsamplerate : NO
Using libudev       : NO
Using dbus          : NO
Using ime           : YES
Using ibus          : NO
Using fcitx         : NO

 

$ make all

$ sudo make install

 

이미지 및 폰트를 나타내기위해 추가 라이브러리가 필요하다.

 

주요 SDL 라이브러리

SDL 모듈

설명

사이트 주소

SDL

비디오 및 오디오 처리를 위한 기본 API 제공

http://www.libsdl.org

SDL_mixer

사운드 처리를 위한 모듈

http://www.libsdl.org/projects/SDL_mixer

SDL_ttf

트루타입 폰트 출력

https://www.libsdl.org/projects/SDL_ttf

SDL_net

네트워킹 라이브러리

http://www.libsdl.org/projects/SDL_net

SDL_rtf

서식 있는 텍스트 포맷 렌더링

http://www.libsdl.org/projects/SDL_rtf

SDL_image

이미지 파일 처리 지원

https://www.libsdl.org/projects/SDL_image

SDL_gfx

, 선 등의 기본 프리미티브 렌더링

https://github.com/ferzkopp/SDL_gfx

http://sourceforge.net/projects/sdlgfx

https://www.libsdl.org/projects/ 를 방문하면 더 많은 라이브러리 최신 소스코드를 다운로드 받을 수 있다.

 

SDL_image 소스코드 다운로드와 컴파일 및 설치

$ wget https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.5.tar.gz

$ tar xvf SDL2_image-2.0.5.tar.gz

$ cd SDL2_image-2.0.5/

$ ./configure

$ make all

$ sudo make install

 

 

새로운 Qt Creator 프로젝트 만들기

 

Qt Creator실행 후 New Project 클릭

Non-Qt Project - Plain C Application으로 프로젝트 생성

 

빌드시스템(Build System) 선택

buildsystem.png

 

qmake로 생성한 경우

프로젝트 생성 완료 후 .pro 파일에 다음과 같이 라이브러리 사용을 명시한다.

CONFIG += link_pkgconfig
PKGCONFIG += sdl2 SDL2_image

 

Qbs를 선택한 경우

*.qbs파일에 다음과 같이 Depends를 추가한다.

Depends{ name: "sdl2" }
Depends{ name: "SDL2_image" }

 

SDL은 기본적으로 다음과 같은 헤더를 포함해야한다.

#include <SDL2/SDL.h>

 

추가로 이미지를 출력하기 위해 다음 헤더를 포함한다.

#include <SDL2/SDL_image.h>

 

다음은 윈도우를 생성하고 이미지를 출력하는 간단한 예제이다.

main.c

#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_timer.h>
#include <SDL2/SDL_image.h>

int main(void)
{
    // attempt to initialize graphics and timer system
    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)
    {
        printf("error initializing SDL: %s\n", SDL_GetError());
        return 1;
    }

    SDL_Window* window = SDL_CreateWindow("Hello, makersweb",
                                          SDL_WINDOWPOS_CENTERED,
                                          SDL_WINDOWPOS_CENTERED,
                                          640, 480, 0);
    if (!window)
    {
        printf("error creating window: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    // create a renderer, which sets up the graphics hardware
    Uint32 render_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC;
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, render_flags);
    if (!renderer)
    {
        printf("error creating renderer: %s\n", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }

    // load the image into memory using SDL_image library function
    SDL_Surface* surface = IMG_Load("resources/makersweb.png");
    if (!surface)
    {
        printf("error creating IMG_Load surface\n");
        goto destroy;
    }

    // load the image data into the graphics hardware's memory
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);
    if (!texture)
    {
        printf("error creating texture: %s\n", SDL_GetError());
        goto destroy;
    }

    // clear the window
    SDL_RenderClear(renderer);

    // draw the image to the window
    SDL_RenderCopy(renderer, texture, NULL, NULL);
    SDL_RenderPresent(renderer);

    // delay a exiting.
    SDL_Delay(5000);

    // clean up resources before exiting.
    SDL_DestroyTexture(texture);

destroy:
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 1;
}

 

Run을 실행하면 윈도우와 함께 이미지가 출력된다.

Screenshot from 2019-10-05 08-44-12.png

 

qmake 프로젝트 압축파일: appsdl.tar.gz