Windows で Rust の開発環境を構築 ~Visual Studio Code編~

  • 4
    いいね
  • 0
    コメント

はじめに

この記事は

  • Windows で Rust を使ってプログラミングをしたい
  • Rust のデバッグ実行環境を整えたい

という人を対象にした、忘却録的な記事です。

開発環境には Visual Studio Code を使用します。

Rust 自体が割りとマニアックなプログラミング言語なうえ、Windows 向けの情報がネット上に少ないようなので書いておけば誰かの役に立つかもしれないと思って書いておきます。

開発環境構築に必要なもの

  • Windows 10 Pro x64(たぶん Windows 7 以降なら問題ないと思います)
  • Rust 1.13.0 stable GNU ABI(これ
  • Rust 1.13.0 stable ソースコード(これ
  • GDB 7.9.1 x64(これ
  • Visual Studio Code 1.8.0(ここ

Rust のバージョンとか GDB のバージョンとかが違うとうまくステップ実行できない場合があるようなので、バージョンは揃えることをおすすめします。
32ビット版は検証していません

手順

全体の手順

  1. Visual Studio Code をインストール
  2. Rust をインストール
  3. GDB を展開して C:\Program Files\gdb-7.9.1-tdm64-2 にコピー
  4. PATH に C:\Program Files\gdb-7.9.1-tdm64-2\bin を追加
  5. Rust ソースコードを展開
  6. Rust ソースコードを C:\Program Files\Rust stable GNU 1.13\src にコピー
  7. 環境変数に RUST_SRC_PATH を追加して値を C:\Program Files\Rust stable GNU 1.13\src に設定
  8. コマンドラインから cargo install racer を実行
  9. コマンドラインから cargo install rustfmt を実行
  10. コマンドラインから cargo install rustsym を実行
  11. Visual Studio Code を起動して Ctrl+Shift+P を押して Installed Extensions を入力
  12. 左のペインに拡張機能が出るので Rusty Code を入力して Rusty Code をインストール
  13. Visual Studio Code を再起動して再び Ctrl+Shift+P を押して Installed Extensions を入力
  14. 左のペインに拡張機能が出るので Native Debug を入力して Native Debug をインストール

これで開発環境は概ね整います。

各プロジェクトごとの手順

  1. 任意のディレクトリでコマンドラインから cargo new プロジェクト名 –-bin を実行してプロジェクトを作成する
  2. Visual Studio Code から作成したプロジェクトのディレクトリを開く(「ファイル」→「フォルダを開く」)
  3. Ctrl+Shift+D を押してデバッグペインを開く
  4. 歯車の設定マークを押して GDB を選択する
  5. launce.json と言う設定ファイルが開かれるので "target": の設定値を "target/debug/プロジェクト名" に変更する(.exe は不要)
  6. Visual Studio Code のエクスプローラーペインから main.rs を開く
  7. Ctrl+Shift+P を押して Cargo: Build Debug を選択してデバッグビルドをする
  8. main.rs の好きな場所にブレークポイントを設定する
  9. Ctrl+Shift+D をデバッグペインを表示して三角の実行ボタンを押す
  10. ビルドしたアプリがデバッグ実行されて、ブレークポイントでストップすれば成功

良き Rust ライフを!

おまけ

追記(2017/03/23):
ビルドするとコマンドプロンプトが出る問題を修正(なんか警告が出るけど気にしない)

Rust から Win32API をコールしてメッセージボックスを表示するサンプル

main.rs
#![no_main]
#![link_args = "-Wl,--subsystem,windows"]

extern crate winapi;
extern crate user32;

use std::ffi::OsStr;
use std::iter::once;
use std::os::raw::{c_char, c_int, c_void};
use std::os::windows::ffi::OsStrExt;
use std::ptr::null_mut;

#[allow(non_snake_case)]
#[no_mangle]
pub extern "system" fn WinMain(_ : *const c_void, _ : *const c_void, _ : *const c_char, _ : c_int) -> c_int {
    let title = text("Title");
    let message = text("Hello, World!");

    unsafe {
        user32::MessageBoxW(null_mut(), message.as_ptr(), title.as_ptr(), winapi::MB_OK);
    }

    0
}

fn text(text: &str) -> Vec<u16> {
    return OsStr::new(text).encode_wide().chain(once(0)).collect::<Vec<u16>>();
}

Cargo.toml の中身は以下の感じ

[package]
name = "プロジェクト名"
version = "0.0.1"

[dependencies]
winapi = "*"
user32-sys = "*"