RustとWSLでGUIの開発出来たら、Visual Studioはいらないよね。
と思って、色々試行錯誤したこと、調べたことのメモ。
前提
Windowsである。
WSLgが動く。
試行1. 普通に開発する(ものによる)
そもそもとして、RustのGUIライブラリのicedというものを使用してGUIアプリケーションを作成しようとしていた。
WSLgによって、LinuxのGUIが見えるようになると聞いていたので、入れてみたが、icedが使用するRustのGUIライブラリであるwinitが動かなかった。
cargo run --package game_of_life Finished dev [unoptimized + debuginfo] target(s) in 0.11s Running `target/debug/game_of_life` Error: GraphicsAdapterNotFound
ほかのGUIライブラリを使用したら動くかもしれい。
例えばpistonは動いたが、最大化で再描写がうまくいっていなかった。
ライブラリ側の対応がなされていくと思う。
試行2. x86_64-pc-windows-gnuでクロスコンパイル
Rustにはcrossというクロスコンパイルツールがあるので簡単にクロスコンパイルができる。
Mingwをインストールする必要がある。
また、その際、Dockerを要求されるので、
- Docker for WindowsをWSL2連携機能を有効にしてインストールする。
- ユーザーをdockerグループに追加する。
を行う必要があった。
そして、
cross run --target x86_64-pc-windows-gnu
とすればよい。
生成されたexeを起動しても、"libstdc++6.dllがない"と言われて起動できない。
(おそらくWindows側にもmingwをインストールすれば起動できるはずだと思うが試していない。)
静的リンクしてみても変わらず。
これを使っても同じだった気がする。
https://github.com/est31/msvc-wine-rust
試行3. x86_64-pc-windows-msvcを使う(ダメ)
Linuxだけでは開発できなさそうだと思ったので、
普通にx86_64-pc-windows-msvcをターゲット指定してみた。
rustにlink.exeがないといわれるので、Visual StudioのBuildToolだけをインストールして、
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\Hostx64\x64
にあるところを、.config/config.tomlに指定すると途中までうまくいきそうになるが、
winsock2.hがないといわれてダメ。
これを使っても同じだった気がする。
https://github.com/strickczq/msvc-wsl-rust
結果
最終的にVisual Studio CommunityのBuildToolは入れてしまったので、
WindowsにもRustup-init.exeで環境をインストールした。
そしてWSLからWindowsにインストールしたcargo.exeを呼び出すという方法でアプリケーションをビルドした。(WSLの意味がない)
WSLのfishに以下のようなaliasを指定して、VScodeのビルドタスクを設定した。
alias wincargo='/mnt/c/Users/${USER}/.cargo/bin/cargo.exe'
{ "version": "2.0.0", "tasks": [ { "type": "shell", "command": "wincargo", "args": [ "run", "--target", "x86_64-pc-windows-msvc" ], "label": "Rust: wincargo run - hoge", "group": { "kind": "build", "isDefault": true }, "problemMatcher": [ "$rustc" ] } ] }
まったく役に立たない記事を書いてしまった。