OpenSiv3DとサンプルアプリケーションをLinuxでビルドするまで(と、WSLでOpenGL4は現状使えないという教訓)

TL; DR

自作の野球シミュレータ(C++)をGUI化したかった。 ゆくゆくはゲーム化したいという野望があったので、ゲームエンジンの力を借りることにした。 UnrealEngineほか選択肢はいくつかあったが、OpenSiv3Dを布教されたので使ってみることにした。

私はWindowsでの開発が好きではなかった。どうやらOpenSiv3DはLinuxでも動くらしく、WSLで動かしてみようと思い、本体のビルドとサンプルアプリケーションのビルドまではうまくいった。その手順をここに残しておくので、「OpenSiv3DをLinuxで動かしたい!」という人の参考になると思う。

結論 : 試行錯誤の末、WSLでは(2019年6月27日現在)OpenGL4を動かすのは無理ということが分かった。

OpenSiv3Dは必要要件にOpenGL4が要ったっぽい。結局WSL上でアプリケーションを動かすことはできなかった。つまり、供養エントリである。

OpenSiv3Dとは

前身のSiv3Dの説明を、公式から引用(このページは旧バージョン)。

Siv3D は C++ で楽しく簡単にインタラクティブなアプリケーションを作れるライブラリです。2D / 3D グラフィックスやオーディオを自在にコントロールし、KinectLeap Motion, カメラやマイクといった様々なデバイスを使った複雑なインタラクションを短いコードで書けます。

これが改良されたものらしい。旧 Siv3D との違い OpenSiv3D リファレンス より引用。

2012 年に最初のバージョンが公開された旧 Siv3Dを、より実用的でモダンな設計に置き換えるため、2016 年 3 月にOpenSiv3Dプロジェクトがスタートしました。

使用例は作者本人によるQiitaがわかりやすい。ブロック崩しが28行のコードで書けるなど、かなり便利なように見える。

インストール

インストールのためには以下のライブラリが必要。

The dependent libraries are as follows:

  • X11, Xi, Xinerama, Xcursor, Xrandr
  • OpenGL
  • OpenCV4
  • libpng, libjpeg-turbo, giflib, libwebp
  • FreeType2, HarfBuzz
  • OpenAL
  • libogg, libvorbis
  • Boost
  • AngelScript
  • GLib2
  • udev
  • libdl

aptで入れられるものはaptでインストールする。自分の環境で足りなかったものは以下の通り。

$ sudo apt install libopenal-dev libturbojpeg0-dev libgif-dev libvorbis-dev libwebp-dev libogg-dev libglew-dev ninja-build libudev-dev

aptだとダメなものたち

OpenCV4のインストール

だいたい これ の通りにやる。ビルドに時間がかかるので、下のboostなどと並行してやると吉。 いくつか注意。

  • Step #3 は今回いらないので飛ばす
  • Run CMake for OpenCV 4 の箇所を、
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
        -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D BUILD_EXAMPLES=ON ..

とする(説明は省くが、 CMake でのビルドの際に使う pkg-config の処理がうまくいくようにしている)。

boost

aptだと最新版が入らないので、最新版を公式からビルドする。2019-06-27時点では1.70.0が必要とのことだったが、公式にその旨の記載がなく、いくらか回り道をした。これからLinux版をインストールする人は公式Slackでboostの必要バージョンを訊ねた方が良さそう。ある程度ビルドに時間がかかります。

1.70.0はここ

ダウンロードしたヘッダファイルを /usr/include に配置。

あと、ここの手順に従ってビルドして、 libboost_***.solibboost_***.a を生成し、 /usr/local/lib/ に配置。

angelscript

そもそもaptにないので、公式 からダウンロード。解凍したあと、

$ cd path/to/sdk/angelscript/projects/gnuc
$ make
$ cd ../../lib
$ sudo cp libangelscript.a libangelscript.so /usr/local/lib 

OpenSiv3D本体のビルド

ガイド に従ってビルド。

サンプルアプリケーションのビルド

$ cd App
$ mkdir build
$ cd build
$ cmake ..
$ make 

できた ./Siv3D_App を実行した結果がこちら。

131: [error] EngineError: glfwCreateWindow() failed. [OpenGL 4.1 is not supported]
zsh: segmentation fault (core dumped)  ./Siv3D_App

「OpenGL4.1に対応していないので glfwCreateWindow() が失敗します」

その後調べると、現状WSLからOpenGL4.1は使えないこと、そもそもWSLはグラフィック用途で使うべきではないなどのStackoverflowの回答を発見し、悲しくなってしまった。

終わりに

同様にWSLでOpenGLを試した先人の方の記事がこちら

So far, trying to develop OpenGL on WSL seemed like a futile attempt. However, for a beginner, failure is always a part of learning. Here are a few takeaways:

  • Future setup for OpenGL development on Linux should be a breeze
  • Learned what extensions are and what they do
  • Learned the difference between direct and indirect rendering
  • Learned how to link libraries with Cmake
  • Saved massive amount of time by learning WSL’s limitations ahead of CS488

この人と同じく、グラフィックやりだす前にWSLの限界が知れてよかった! という気持ちになった。やったね!

あと、CMakeのことがなんとなくわかるようになったこともよかった。時間は溶けたが学びはあった。

今後:とりあえず外付けSSDを買ってネイティブLinuxを入れ、そこで使ってみたいと思う。成功したら追記したい。

Slackでたくさん助けていただいた@reputelessさん、@wynd2608さん、本当にありがとうございました。

追記

OpenSiv3DのLinuxでのインストールの際、2点ほど引っかかったのでここに書いておく。

1. 1点インクルード忘れ? があった。

OpenSiv3D本体のビルドで、 ninjaを実行するステップ。

/home/szkieletor/.local/lib/OpenSiv3D/Siv3D/src/Siv3D/Geometry2D/SivGeometry2D.cpp:2765:72: error: use of undeclared identifier 'gVec2'
                        return std::max(0.0, boost::geometry::distance(gBox(a.pos, a.br()), gVec2(a.x, a.y)) - b.r);

みたいなエラーが出た。

boost::geometry::model::d2 が定義されているのは boost/geometry/geometries/point_xy.hpp だが、これがインクルードされていないようだった。

SivGeometry2D.cpp

# include <boost/geometry/geometries/point_xy.hpp>

を追加したらビルドが成功した。

2. サンプルプログラムのビルドで、要求される libSiv3D.a のロケーションがデフォルトと違う

Release/libSiv3D.a を要求されたので、そこにコピーしてあげる。

$ mkdir Release // OpenSiv3D/Linux で
$ cp libSiv3D.a release

これでサンプルプログラムのビルドもうまくいった。

何か質問や訂正などあれば、遠慮なくTwitterまでどうぞ。