e-tipsmemo

ごった煮

WSLでGUIの開発(調査)

RustとWSLでGUIの開発出来たら、Visual Studioはいらないよね。
と思って、色々試行錯誤したこと、調べたことのメモ。

前提

Windowsである。
WSLgが動く。

試行1. 普通に開発する(ものによる)

そもそもとして、RustのGUIライブラリのicedというものを使用してGUIアプリケーションを作成しようとしていた。
WSLgによって、LinuxGUIが見えるようになると聞いていたので、入れてみたが、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がない"と言われて起動できない。
f:id:katakanan:20210530215420p:plain
(おそらく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"
			]
		}
	]
}

まったく役に立たない記事を書いてしまった。