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

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 Pluma(C++ Plug-in Management Framework) 튜토리얼 file makersweb 2019.12.07 15191
35 GENIVI DLT(Diagnostic Log and Trace) 활용 file makersweb 2020.11.19 12988
34 GDBus 튜토리얼(GDBus tutorial) file makersweb 2019.06.30 12975
33 Dear ImGui, 경량의 C++ 용 GUI 및 Widget 라이브러리 file makersweb 2020.11.28 11222
32 ZeroMQ의 기본 메세지 패턴들 file makersweb 2020.07.31 10489
31 텔레그램(Telegram) Bot 개발 file makersweb 2019.07.21 7226
30 가볍고 쉬운 임베디드용 그래픽 라이브러리 - LVGL file makersweb 2020.09.16 5316
29 webOS소개 및 Raspberry Pi 3 에서 실행 file makersweb 2019.10.13 5222
28 Flutter Application 에서 한글(EUC-KR) 깨져서 나오는 문제 file makersweb 2022.01.06 4829
» 리눅스에서 SDL2 최신버전 컴파일과 Qt Creator로 개발환경 구성 file makersweb 2019.10.06 4582
26 [SDL2 와 OpenGL]윈도우 생성과 2D그래픽 file makersweb 2020.04.11 4445
25 AGL (Automotive Grade Linux) 개요 file makersweb 2022.06.19 3807
24 [NodeGui] JavaScript로 데스크탑 응용프로그램 작성 file makersweb 2023.02.21 3792
23 LVGL 을 통해 GUI 구현 시 한글 폰트 추가 file makersweb 2023.02.07 3623
22 Nana, C++용 크로스플랫폼 GUI 라이브러리 file makersweb 2021.01.06 3598
21 Wayland IVI Extension 간단 리뷰 file makersweb 2019.05.12 3517
20 ZeroMQ 비동기 클라이언트/서버 패턴 file makersweb 2020.08.13 3457
19 CANdevStudio 를 사용하여 CAN 네트워크 시뮬레이션 file makersweb 2021.03.09 3366
18 Flutter/Dart 와 Qt/QML 비교 file makersweb 2021.11.07 2952
17 NAppGUI, C언어용 크로스 플랫폼 GUI 라이브러리 file makersweb 2022.10.10 2681