WSL を使って CUI で LovyanGFX for PC を試してみる

勉強会で、MS-Windows で VisualStudio をインストールできない人がいたので、代わりの方法として Ubuntu で動かす手順なら WSL でそのまま動くかな? と試してみました。

# 環境


- エディション Windows 10 Pro
- バージョン 21H2 
- OS ビルド 19044.2364

# WSL

「WSL2 をインストール」
https://qiita.com/nanbuwks/items/e3db5fe9c03c76a62227
の通りインストール済みです。


# SDL2 を使えるようにする
「SDL2 のサンプルプログラムを試す」
https://qiita.com/nanbuwks/items/379013b65fa10ce042a5
の通り試していくと・・・

```
$ ./sdltest
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
```

エラーが出ました。これを防ぐには Xサーバが必要らしいですが・・・

「Linux 用 Windows サブシステムで Linux GUI アプリを実行する」
https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps

によると、今どきの WSL だと Linux GUI アプリケーションが使えるようになっているとのこと。
> この機能にアクセスするには、ビルド 19044 以降またはWindows 11 Windows 10する必要があります。

とのことですが要件は満たしていますが、WSLは ビルド 19044 より前にインスールしたままなので、WSLのバージョンアップが必要かな?
Power Shell にて
```
PS C:\Users\WinTest> wsl --update
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム  はインストールされました。

```

とするとサンプル画像の表示ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/89348fd6-7daa-44b2-fa2e-47b9311c5772.png)

# LovyanGFX for PC の用意

develop branch を指定してクローンします。
```
$ git clone -b develop https://github.com/lovyan03/LovyanGFX.git

```

作業場所に移動します。
```
$ cd LovyanGFX/
$ cd examples_for_PC/CMake_SDL/

```


13日目の記事
「LovyanGFX for PC 完全体を g++ on Ubuntu で」
https://qiita.com/nanbuwks/items/e316398aa12a90576cc7

より、 `pc.hpp` を作り、保存します。


サンプルプログラムの調整をします。


user_code.cpp の冒頭に、先程作ったファイルを読み込むように記述します。

```
#include "pc.hpp"
```

また、ウェイトをかけるのに lgfx::delay を使うようになっていますが pc.hpp の処理と競合するので対処します。今回は単純にコメントアウトしました。

```
//  lgfx::delay(1);
```

# ビルド

以下のようにエラーが出ました
```
$ g++ -o test user_code.cpp LGFX_SDL.cpp ../../../LovyanGFX
/src/lgfx/utility/*.c ../../../LovyanGFX/src/lgfx/v1/*.cpp ../../../LovyanGFX/src/lgfx/v1/misc/*.cpp  ../../../LovyanGFX
/src/lgfx/v1/panel/Panel_Device.cpp ../../../LovyanGFX/src/lgfx/v1/platforms/sdl/*.cpp  -lm -lSDL2  -lSDL2_image -I../..
/../LovyanGFX/src -I../../../LovyanGFX/src/lgfx/v1  -L../../../LovyanGFX/src/lgfx -DLGFX_SDL
../../../LovyanGFX/src/lgfx/utility/lgfx_qoi.c: In function ‘size_t lgfx_qoi_encode(const void*, const qoi_desc_t*, int, lgfx_qoi_encoder_get_row_func, lfgx_qoi_writer_func, void*)’:
../../../LovyanGFX/src/lgfx/utility/lgfx_qoi.c:335:19: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘size_t’ {aka ‘long unsigned int’} [-Wformat=]
  335 |     debug_printf( "Can't malloc %d bytes", writeBufferSize);
      |                   ^~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~
      |                                            |
      |                                            size_t {aka long unsigned int}
../../../LovyanGFX/src/lgfx/utility/lgfx_qoi.c:73:43: note: in definition of macro ‘debug_printf’
   73 | #define debug_printf(...) fprintf(stderr, __VA_ARGS__)
      |                                           ^~~~~~~~~~~
../../../LovyanGFX/src/lgfx/utility/lgfx_qoi.c:335:34: note: format string is defined here
  335 |     debug_printf( "Can't malloc %d bytes", writeBufferSize);
      |                                 ~^
      |                                  |
      |                                  int
      |                                 %ld
/usr/bin/ld: /tmp/cctsjkUw.o: undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
```

調べると、`-pthread` オプションをつけると良いらしいです。

```
$ g++ -o test user_code.cpp LGFX_SDL.cpp ../../../LovyanGFX/src/lgfx/utility/*.c ../../../LovyanGFX/src/lgfx/v1/*.cpp ../../../LovyanGFX/src/lgfx/v1/misc/*.cpp  ../../../LovyanGFX/src/lgfx/v1/panel/Panel_Device.cpp ../../../LovyanGFX/src/lgfx/v1/platforms/sdl/*.cpp  -lm -lSDL2  -lSDL2_image -I../../../LovyanGFX/src -I../../../LovyanGFX/src/lgfx/v1  -L../../../LovyanGFX/src/lgfx -DLGFX_SDL  -pthread
```

コンパイルできました。実行します。

```
$ ./test
```

うまく実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/138a9039-cfed-f8bb-ade2-3c1224aab742.png)

# 感想

ネイティブ Linux アプリが X を意識せずに使えるようになっているのは素晴らしいですね。WSL自体のアップデート時に不安定になりがちなのですが、それさえ克服できればマルチプラットフォームであれこれするベースに Ubuntu や X アプリを考えてもいいかな?