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