やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

MMD読込ライブラリSabaをビルドするも使えなかった

 ラズパイ4Bで動かず。

情報源

手順

sudo apt-get install libbullet-dev
sudo apt-get install libglfw3-dev
git clone https://github.com/benikabocha/saba.git
cd saba
mkdir build
cd build
cmake ..
make -j4
./saba_viewer

 makeでエラーになった……。

[ 89%] Built target SabaViewer
make: *** [Makefile:95: all] エラー 2

 makeの-j4オプションをとって再実行すると進んだが、やはり同じエラー。

make
[ 98%] Building CXX object example/CMakeFiles/simple_mmd_viewer_glfw.dir/simple_mmd_viewer_glfw.cpp.o
/tmp/work/saba/example/simple_mmd_viewer_glfw.cpp: In function ‘bool SampleMain(std::vector<std::__cxx11::basic_string<char> >&)’:
/tmp/work/saba/example/simple_mmd_viewer_glfw.cpp:1245:18: error: ‘GLFW_TRANSPARENT_FRAMEBUFFER’ was not declared in this scope
   glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GL_TRUE);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/work/saba/example/simple_mmd_viewer_glfw.cpp:1245:18: note: suggested alternative: ‘GL_READ_FRAMEBUFFER’
   glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GL_TRUE);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  GL_READ_FRAMEBUFFER
make[2]: *** [example/CMakeFiles/simple_mmd_viewer_glfw.dir/build.make:63: example/CMakeFiles/simple_mmd_viewer_glfw.dir/simple_mmd_viewer_glfw.cpp.o] エラー 1
make[1]: *** [CMakeFiles/Makefile2:469: example/CMakeFiles/simple_mmd_viewer_glfw.dir/all] エラー 2
make: *** [Makefile:95: all] エラー 2

 ./build/Makefileの95行目は以下。

 $(MAKE) -f CMakeFiles/Makefile2 all

 ./build/CMakeFiles/Makefile2

 以下でググると「メモリ不足」が原因らしい。

make: *** [Makefile:95: all] エラー 2

 ログを見るとコードにエラーがあるように見える。

[  6%] Built target fcpp
[ 36%] Built target lua
[ 59%] Built target Saba
[ 61%] Built target mmd2obj
[ 62%] Building CXX object example/CMakeFiles/simple_mmd_viewer_glfw.dir/simple_mmd_viewer_glfw.cpp.o
[ 88%] Built target SabaViewer
[ 90%] Built target saba_viewer
[ 98%] Built target gtests
/tmp/work/saba/example/simple_mmd_viewer_glfw.cpp: In function ‘bool SampleMain(std::vector<std::__cxx11::basic_string<char> >&)’:
/tmp/work/saba/example/simple_mmd_viewer_glfw.cpp:1245:18: error: ‘GLFW_TRANSPARENT_FRAMEBUFFER’ was not declared in this scope
   glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GL_TRUE);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/work/saba/example/simple_mmd_viewer_glfw.cpp:1245:18: note: suggested alternative: ‘GL_READ_FRAMEBUFFER’
   glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GL_TRUE);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  GL_READ_FRAMEBUFFER
make[2]: *** [example/CMakeFiles/simple_mmd_viewer_glfw.dir/build.make:63: example/CMakeFiles/simple_mmd_viewer_glfw.dir/simple_mmd_viewer_glfw.cpp.o] エラー 1
make[1]: *** [CMakeFiles/Makefile2:469: example/CMakeFiles/simple_mmd_viewer_glfw.dir/all] エラー 2
make: *** [Makefile:95: all] エラー 2
エラー:「GLFW_TRANSPARENT_FRAMEBUFFER」はこのスコープで宣言されていません
注:代替案:「GL_READ_FRAMEBUFFER」

 ググってみると定義値が出た。

#define GLFW_TRANSPARENT_FRAMEBUFFER   0x0002000A

Window framebuffer transparency window hint and window attribute.

vim /tmp/work/saba/example/simple_mmd_viewer_glfw.cpp

 :1245Enterして1245行目を表示。定義#define ...を追加。:wで書き込み。

#define GLFW_TRANSPARENT_FRAMEBUFFER   0x0002000A
        glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GL_TRUE);

 再びビルド。

make -j4
[  6%] Built target fcpp
[ 36%] Built target lua
[ 59%] Built target Saba
Scanning dependencies of target simple_mmd_viewer_glfw
[ 61%] Built target mmd2obj
[ 62%] Building CXX object example/CMakeFiles/simple_mmd_viewer_glfw.dir/simple_mmd_viewer_glfw.cpp.o
[ 88%] Built target SabaViewer
[ 94%] Built target saba_viewer
[ 98%] Built target gtests
[ 99%] Linking CXX executable simple_mmd_viewer_glfw
[100%] Built target simple_mmd_viewer_glfw

 完了!

./saba_viewer

 実行するもエラー……。

$ ./saba_viewer
[2020-04-26 11:27:46.652] [default] [info] Start
[2020-04-26 11:27:46.806] [default] [info] Disable MSAA
[2020-04-26 11:27:46.806] [default] [info] Execute Path = /tmp/work/saba/build/saba_viewer
[2020-04-26 11:27:46.806] [default] [info] CurDir = /tmp/work/saba/build
[2020-04-26 11:27:47.346] [default] [error] Window Create Fail.

 さっきコード修正した行を以下のように修正。これはエラーに出ていたGL_READ_FRAMEBUFFERを使ってみた。

//#define GLFW_TRANSPARENT_FRAMEBUFFER   0x0002000A
//     glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GL_TRUE);
        glfwWindowHint(GL_READ_FRAMEBUFFER, GL_TRUE);

 再度実行するも、同様のエラー……。

 GLFWをビルドしてみる。

$ git clone https://github.com/benikabocha/saba.git
fatal: destination path 'saba' already exists and is not an empty directory.
$ cd saba
$ git submodule init
Submodule 'external/glfw' (https://github.com/glfw/glfw.git) registered for path 'external/glfw'
Submodule 'external/glslang' (https://github.com/KhronosGroup/glslang.git) registered for path 'external/glslang'
$ git submodule update
Cloning into '/tmp/work/saba/external/glfw'...
Cloning into '/tmp/work/saba/external/glslang'...
Submodule path 'external/glfw': checked out '999f3556fdd80983b10051746264489f2cb1ef16'
Submodule path 'external/glslang': checked out '1c573fbcfba6b3d631008b1babc838501ca925d3'
$ mkdir build
mkdir: ディレクトリ `build' を作成できません: ファイルが存在します
$ cd build
$ cmake -D SABA_FORCE_GLFW_BUILD ..
Parse error in command line argument: -D
Should be: VAR:type=value
CMake Error: No cmake script provided.
CMake Error: Problem processing arguments. Aborting.
cmake -D SABA_FORCE_GLFW_BUILD=1 ..
CMake Deprecation Warning at external/glfw/CMakeLists.txt:10 (cmake_policy):
  The OLD behavior for policy CMP0042 will be removed from a future version
  of CMake.

  The cmake-policies(7) manual explains that the OLD behaviors of all
  policies are deprecated and that a policy should be set to OLD only under
  specific short-term circumstances.  Projects should be ported to the NEW
  behavior and not rely on setting a policy to OLD.


-- Found Vulkan: /usr/lib/arm-linux-gnueabihf/libvulkan.so  
-- Using X11 for window creation
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/work/saba/build

 ダメ。わけわからん。

所感

 Sabaは使えなかった。

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux