ゼロから始めるシンプルなSDL2アプリ構築

このページでは、Mesonのみを使用してSDL2 GUIアプリケーションを定義およびビルドする方法を基礎から説明します。このドキュメントは、最も複雑なプラットフォームであるWindows向けに記述されていますが、基本的な考え方はLinuxやmacOSでも同様に機能するはずです。

サンプルアプリケーションは、SDL 2もCで記述されているため、プレーンなCで記述されています。C++を好む場合は、変換は非常に簡単で、読者への練習問題として残されています。

このドキュメントでは、Visual StudioとMesonの両方が既にインストールされていることを前提としています。

ビルドディレクトリのセットアップ

まず、すべてのファイルのための空のディレクトリを作成する必要があります。Visual Studioツールチェーンはやや特殊で、特定のシェルからビルドを実行する必要があります。これは、アプリケーションメニューを開いて「Visual Studio <年> -> x86_64 ネイティブツールコマンドプロンプト」を選択することで見つけることができます。

奇妙なディレクトリに移動するため、ホームディレクトリに移動する必要があります。

cd \users\yourusername

通常は `cd \users\` と入力し、Tabキーを押してシェルでユーザー名を自動補完します。それが終わったら、ディレクトリを作成できます。

mkdir sdldemo
cd sdldemo

サンプルプログラムの作成

次に、ソースファイルとMesonビルド定義ファイルを作成する必要があります。ここではSDLをまったく使用せず、代わりにテキストを出力するだけのシンプルなプログラムから始めます。それが動作したら、グラフィックスを処理するように拡張できます。ソースは `sdlprog.c` ファイルに記述され、次の内容になります。

#include <stdio.h>

int main(int argc, char **argv) {
  printf("App is running.\n");
  return 0;
}

ビルド定義は `meson.build` というファイルに記述され、次のようになります。

project('sdldemo', 'c')

executable('sdlprog', 'sdlprog.c')

これで、次のコマンドを使用してビルドを開始できます。

meson setup builddir

ここで `builddir` は *ビルドディレクトリ* であり、ビルド中に生成されるすべてのファイルは、このディレクトリに配置されます。実行すると、次のようになります。

Configuring the sample application

プログラムはこれによってコンパイルされます。

meson compile -C builddir

`-C` 引数は、Mesonに設定済みのビルドディレクトリを指定します。

プログラムはビルドディレクトリに配置され、次のように実行できます。

builddir\sdlprog

出力は次のようになります。

Running the sample application

SDLを使用するようにプログラムをアップグレードする

SDLを開始するために必要なコードはもう少し複雑で、その動作方法については説明しません。`sdlprog.c` の内容を次のように置き換えるだけです。

#include "SDL.h"

int main(int argc, char *argv[])
{
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Surface *surface;
    SDL_Event event;

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError());
        return 3;
    }

    if (SDL_CreateWindowAndRenderer(320, 240, SDL_WINDOW_RESIZABLE, &window, &renderer)) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window and renderer: %s", SDL_GetError());
        return 3;
    }

    while (1) {
        SDL_PollEvent(&event);
        if (event.type == SDL_QUIT) {
            break;
        }
        SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;
}

もう一度 `meson compile -C builddir` を実行して、これをコンパイルしてみましょう。

Building SDL app fails

失敗します。その理由は、現在SDLが利用できないためです。何らかの方法で入手する必要があります。より専門的な用語では、SDL2は *外部依存関係* であり、それを取得することを *依存関係解決* と呼びます。

Mesonには、依存関係のダウンロードとビルド(必要な場合)を行うWebサービスであるWrapDBがあります。これはSDL2を提供するため、直接使用できます。まず、Mesonではこのようなすべてのサブプロジェクトを整合性のためにこのディレクトリに格納する必要があるため、`subprojects` ディレクトリを作成する必要があります。

mkdir subprojects

次に、依存関係をインストールできます。

meson wrap install sdl2

次のようになります。

Obtaining SDL2 from WrapDB

最後のステップとして、新しく取得した依存関係を使用するようにビルド定義ファイルを更新する必要があります。

project('sdldemo', 'c',
        default_options: 'default_library=static')

sdl2_dep = dependency('sdl2')

executable('sdlprog', 'sdlprog.c',
           win_subsystem: 'windows',
           dependencies: sdl2_dep)

**注:** Windowsを使用している場合は、sdl2main依存関係も含める必要があります。これを行うには、上記のビルドスクリプトを次のように変更できます。

project('sdldemo', 'c',
        default_options: 'default_library=static')

sdl2_dep = dependency('sdl2')
sdl2_main_dep = dependency('sdl2main')

executable('sdlprog', 'sdlprog.c',
           win_subsystem: 'windows',
           dependencies: [sdl2_dep, sdl2_main_dep])

依存関係に加えて、他にもいくつかの変更があります。まず、ヘルパーライブラリを静的にビルドすることを指定します。このようなシンプルなプロジェクトでは、物事をシンプルにします。また、ビルドしているプログラムがコンソールアプリケーションではなくWindows GUIアプリケーションであることをMesonに伝える必要があります。

これですべてであり、再度 `meson compile` を実行できます。まず、システムがSDL2をダウンロードして設定します。

Running the sample application

しばらくすると、コンパイルが正常に終了します。

Running the sample application

プログラム完了

これで、次を使用してアプリケーションを実行できます。

builddir\sdlprog

最終結果は、黒いSDLウィンドウです。

Running the sample application

検索結果