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

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

번호 제목 글쓴이 날짜 조회 수
36 Wayland IVI Extension 간단 리뷰 file makersweb 2019.05.12 2988
35 GDBus 튜토리얼(GDBus tutorial) file makersweb 2019.06.30 11651
34 텔레그램(Telegram) Bot 개발 file makersweb 2019.07.21 6552
» 리눅스에서 SDL2 최신버전 컴파일과 Qt Creator로 개발환경 구성 file makersweb 2019.10.06 3771
32 webOS소개 및 Raspberry Pi 3 에서 실행 file makersweb 2019.10.13 4633
31 도커(docker)설치 및 기본 명령어 makersweb 2019.12.02 1248
30 Pluma(C++ Plug-in Management Framework) 튜토리얼 file makersweb 2019.12.07 14697
29 [SDL2 와 OpenGL]윈도우 생성과 2D그래픽 file makersweb 2020.04.11 3839
28 ZeroMQ의 기본 메세지 패턴들 file makersweb 2020.07.31 9628
27 ZeroMQ 비동기 클라이언트/서버 패턴 file makersweb 2020.08.13 2630
26 Qt와 GStreamer 로 작성한 flac 오디오 재생 예제 file makersweb 2020.09.05 1864
25 가볍고 쉬운 임베디드용 그래픽 라이브러리 - LVGL file makersweb 2020.09.16 4371
24 윈도우에서 안드로이드 flutter 프로그래밍 개발환경 구축(with Visual Studio Code) file makersweb 2020.09.16 1606
23 GENIVI DLT(Diagnostic Log and Trace) 활용 file makersweb 2020.11.19 10622
22 Dear ImGui, 경량의 C++ 용 GUI 및 Widget 라이브러리 file makersweb 2020.11.28 10235
21 라즈베리파이4에서 openFrameworks 예제 실행 file makersweb 2020.12.13 1385
20 Nana, C++용 크로스플랫폼 GUI 라이브러리 file makersweb 2021.01.06 2900
19 라즈베리파이에서 Redis의 Pub/Sub 패턴을 사용하는 Electron 응용프로그램 file makersweb 2021.01.31 1460
18 Protocol Buffers 를 이용한 직렬화 with Conan Package Manager file makersweb 2021.02.24 1589
17 CANdevStudio 를 사용하여 CAN 네트워크 시뮬레이션 file makersweb 2021.03.09 2594