LinuxとWindowsでビルドできるRust-SDL2プロジェクトを作成する

タグ: rust sdl2 / 公開: 2021-01-11

概要

Rust-SDL2ではSDL2を使ったアプリケーションを複数のプラットフォーム向けにビルドできます。 cargo-vcpkgも併用すればvcpkgでSDL2をインストールできるため、事前にライブラリをインストールする必要もありません。 ビルドできるバイナリでSDL2は静的リンクになります。

この記事ではRust-SDL2とcargo-vcpkgを使った最小限のプロジェクトを作成し、LinuxとWindowsの両方でビルドし動作させることができるか試してみます。 ソースコード一式は以下のGitHubリポジトリにあります。

https://github.com/xmisao/sdl2example

前提ソフトウェア

ソフトウェアバージョン備考
Rust1.49.0-
Rust-SDL20.34.2https://github.com/Rust-SDL2/rust-sdl2
cargo-vcpkg0.15.0https://github.com/mcgoo/vcpkg-rs

準備

Rust, Gitのインストール

RustとGitをインストールします。 Gitはcargo-vcpkgが動作するために必要です。 公式も親切ですし、ググれば出てくるので、具体的な手順は割愛します。

cargo-vcpkgのインストール

以下のコマンドを実行しcargo-vcpkgをインストールします。

cargo install cargo-vcpkg

これでcargo vcpkgというサブコマンドが使えるようになります。

アプリケーションの実装

cargoパッケージを作成する

バイナリテンプレートで適当なcargoパッケージを作成します。

cargo new --bin sdl2example

以降の作業はcargoパッケージのルートディレクトリで行います。

依存関係の設定

Rust-SDL2でSDL2をcargo-vcpkgでインストールするように依存関係を設定します。 設定はRust-SDL2のREADMEを参考にします。

https://github.com/Rust-SDL2/rust-sdl2#windows-linux-and-macos-with-vcpkg

以下を Cargo.toml の末尾に追記します。

[dependencies.sdl2]
version = "0.34"
default-features = false
features = ["ttf","image","gfx","mixer","static-link","use-vcpkg"]

[package.metadata.vcpkg]
dependencies = ["sdl2", "sdl2-image[libjpeg-turbo,tiff,libwebp]", "sdl2-ttf", "sdl2-gfx", "sdl2-mixer"]
git = "https://github.com/microsoft/vcpkg"
rev = "a0518036077baa4"

[package.metadata.vcpkg.target]
x86_64-pc-windows-msvc = { triplet = "x64-windows-static-md" }

main.rsを実装する

以下のソースコードはRust-SDL2のデモでウィンドウを出すだけのSDL2アプリケーションです。 main.rsを丸々この内容に書き換えます。

extern crate sdl2;

use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use std::time::Duration;

pub fn main() -> Result<(), String> {
    let sdl_context = sdl2::init()?;
    let video_subsystem = sdl_context.video()?;

    let window = video_subsystem
        .window("rust-sdl2 demo: Video", 800, 600)
        .position_centered()
        .opengl()
        .build()
        .map_err(|e| e.to_string())?;

    let mut canvas = window.into_canvas().build().map_err(|e| e.to_string())?;

    canvas.set_draw_color(Color::RGB(255, 0, 0));
    canvas.clear();
    canvas.present();
    let mut event_pump = sdl_context.event_pump()?;

    'running: loop {
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit { .. }
                | Event::KeyDown {
                    keycode: Some(Keycode::Escape),
                    ..
                } => break 'running,
                _ => {}
            }
        }

        canvas.clear();
        canvas.present();
        ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 30));
        // The rest of the game loop goes here...
    }

    Ok(())
}

ビルドと実行

ビルド

アプリケーションをビルドします。

最初はcargo vcpkg buildでSDL2を落としてきてビルドしてやる必要があります。

cargo vcpkg build

あとは通常通りビルドするだけです。リリースビルドしています。

cargo build --release

これはtarget/release以下に実行ファイルが出力されます。 容量はWindowsで3.4MB, Linuxで4.6MBほどでした。

補足: ダイナミックリンクされたライブラリの確認

この方法ではSDL2は静的リンクされます。 Linuxでlddで確認してみます。

$ ldd target/release/sdl2example
        linux-vdso.so.1 (0x00007fff7777f000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f66b485d000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f66b483b000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f66b46f7000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f66b46f1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f66b452c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f66b4a4d000)

実行

ビルドしたアプリケーションを実行します。 真っ赤なウィンドウが出たら成功です。

cargo run --release

Windowsの動作例

Windows

Linuxの動作例

Linux

まとめ

かなり簡単にSDL2を使ったアプリケーションを作ることができました。

Rustとcargo-vcpkgを使った開発体験もとても良いと思います。SDL2でゲームが作りたければ活用してみても良いのではないでしょうか。

ただしRust-SDL2にはまだ参考にできるドキュメントが少ないです。狙い通り動かすにはCでの使い方を知った上で適宜Rust-SDL2のコードを読む必要があるでしょう。

この記事をSNSでシェアする
タイトルとURLをコピーする
または投稿画面を開く
Author
Icon
ぺけみさお / xmisao
プログラマ。
Subscription
Recent articles
Related to rust
Related to sdl2