🌊

SDL2に入門してみる(環境構築編)

2023/10/27に公開

ゲームエンジン関連の騒動もあり、せっかくなので普段のゲームエンジンから離れてC++でゲームを作ってみようと思いSDL2を使ってみました。

この記事では、WindowsとmacOSでのSDL2の開発環境を構築する手順を解説します。

SDL2とは

SDL2は、描画周りやキーボード/コントローラー入力などの低レベルな機能へのアクセスを提供してくれるライブラリです。WindowsやLinuxだけでなく、iOS,Androidなど幅広いプラットフォームに対応しています。

C++の環境構築

SDL2を試す為にVSCodeでCmakeを動かせる環境を用意します。すでに他の開発環境がある場合は飛ばして大丈夫です。

MinGW-w64のインストール(Windowsのみ)

Windowsには初めからGNUツールチェーンが入っていないので、MinGW-w64を入れてgccなどを使えるようにします。

GithubのReleaseページを開いてください。
いくつかファイルがあると思います。ファイル名はオプションを指していて、意味は以下のようになっています。

名前 意味 おすすめ
i686/x86_64 CPUのアーキテクチャ(ビット数)
mcf/posix/win32 スレッドモデル
dwarf/sjlj/seh 例外処理のシステム
ucrt/msvcrt ランタイムライブラリ

違いが分からければとりあえずx86_64-X.X.X-release-posix-seh-ucrt-rt_vX-revX.7zをダウンロードしておけば大丈夫です。

ダウンロードしたファイルを7zipで解凍したら、適当なディレクトリ(Cドライブ直下など)に置きます。そして、置いたディレクトリ内のbinディレクトリへのパス(Cドライブ直下ならC:\mingw64\bin)をユーザー環境変数のPathに追加します。

CMakeのインストール

Cmakeはコンパイラに依存しないビルド自動化ツールです。事前に記述したCmakeLists.txtの通りにビルドプロセスを実行してくれます。

chocolateyやbrewなどのパッケージマネージャーでインストールでインストールするのが手っ取り早いです。

windows
# インストーラー側に引数を渡してPATHを通してもらう(https://github.com/chocolatey-community/chocolatey-packages/issues/987)
$ sudo choco install cmake --installargs '"ADD_CMAKE_TO_PATH=User"'
macOS
$ brew install cmake
Windowsでのsudoについて

chocolateyではパッケージのインストールに管理者権限が必要です。
gsudoを入れておけばunix系osのsudo感覚で管理者権限でコマンドを実行できます。

スタートメニューを右クリックし、ターミナル(管理者)からシェルを起動
スタートメニューを右クリックし、ターミナル(管理者)からシェルを起動

$ choco install gsudo

VSCodeのインストール

VSCodeが入ってなければサイトからインストーラーをダウンロードしてください。

拡張機能のインストール

VSCodeにC++とCMake拡張機能を入れていきます。
設定が汚れるのが気になる場合はプロファイルを切っておくことをおすすめします。

拡張機能の検索からC/C++ Extension Packを探してインストールしましょう。

動かしてみる

この時点ですでに素のC++なら実行できるはずです。試しにHello World!してみましょう。
まずはmain.cppというファイルを作り、簡単なログ出力を書いていきます。

main.cpp
#include <iostream>

int main(int, char**)
{
    std::cout << "Hello World!" << std::endl;
}

次にCMakeLists.txtというCMakeでのビルドのコンフィグファイルを作り、以下のように記述します。

CMakeLists.txt
cmake_minimum_required(VERSION 3.26) # この設定のCMakeの最低バージョン
project(HelloWorld) # プロジェクトの名前の設定

add_executable(${PROJECT_NAME} main.cpp) # main.cppをHelloWorld.exeにビルド

ここまでできたらコマンドパレットから> CMake: Run Without Debuggingで実行してみましょう。

cpp_games\HelloWorld\build via △ v3.27.7 
❯ ."C:/Users/myuser/Documents/cpp_games/HelloWorld/build/HelloWorld.exe"
Hello World!

このようにログ出力ができれば成功です。

SDLのビルド・インストール

今回はWindowsとmacOSを想定してビルドとインストールをしていきます。

macOS

macOSの場合はbrewでインストールしてしまうのが一番早いです。

$ brew install sdl2

brewを使わない場合は、Windowsとほぼ同じ方法でインストールできます。
その場合はビルドシステムの生成のコマンドで-G MinGW Makefilesが必要なくなります。

Windows

Windowsの場合はSDLのgitリポジトリを落としてきて、CMakeでビルドとインストールをしていきます。

まずはSDLのリポジトリをクローンし、ディレクトリに移動します。

git clone git@github.com:libsdl-org/SDL.git
cd SDL

次にビルドしたいバージョンのブランチ・タグに移動します。
mainブランチではSDL3の開発が進んでいるようですが、リリースはされていないので今回はSDL2のバージョンで現在最新のrelease-2.28.4に移動します。

git switch --detach tags/release-2.28.4

ここからビルドをしていきます。
まずはcmakeでビルドシステムの生成をします。

cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release

リポジトリのディレクトリ内にbuildディレクトリができているはずなので移動し、ビルドシステムから実際にビルドしてみます。

cd build
cmake --build . --config Release --parallel

ビルドが完了したら、以下のコマンドでインストールしましょう。

sudo cmake --install . --config Release

動くか試す

ここまで来たらあとは実際に動くか試すだけです。

VSCodeに戻り、main.cppCMakeLists.txtを以下のように記述します。

main.cpp
#include "SDL.h"

int main(int argc, char *argv[])
{

    SDL_Window *window;

    SDL_Init(SDL_INIT_VIDEO);

    window = SDL_CreateWindow(
        "Hello SDL",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_OPENGL);

    SDL_bool quit_flag = SDL_FALSE;
    SDL_Event event;

    while (!quit_flag)
    {
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                quit_flag = SDL_TRUE;
                break;
            }
        }
    }

    SDL_Quit();
    return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.26)
project(HelloWorld)

set(CMAKE_CXX_STANDARD 17)

find_package(SDL2 CONFIG REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} PRIVATE ${SDL2_LIBRARIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS})

if (WIN32)
	add_custom_command(
			TARGET ${PROJECT_NAME} POST_BUILD
			COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:SDL2::SDL2>" "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
			VERBATIM
	)
endif ()

これを実行することで、ウィンドウが表示され、×ボタンを押すことでプログラムが終了するはずです。

おわりに

長くなってしまいましたが、これでSDL(とC++)の一番の関門である環境構築ができました。
最後のコードの説明などはまた別の記事にまとめていこうと思います。

Discussion