工学社の「グラフィックス・アプリ」制作のためのOpenGL入門のサンプルコードをRaspberry Piで実行する方法
「グラフィックス・アプリ」制作のためのOpenGL入門 のサンプルコードをRaspberry Pi 4で実行する方法について述べる。
試してないけど、Pi3とかでも別に動くと思う。
raspi-config で GL Driver を有効にする
raspi-configを立ち上げる。
$ sudo raspi-config
"7 Advanced Options"を選択。
"A7 GL Driver" を有効にして終了(再起動するよ)
xorg-devをインストール
必要なコンポーネントをインストールする。
$ sudo apt update
$ sudo apt install -y xorg-dev
GLFWのインストール
git clone https://github.com/glfw/glfw
cd glfw
cmake .
make
sudo make install
GLEWのインストール
GLEW( http://glew.sourceforge.net/ )
$ sudo apt update
$ sudo apt install -y build-essential libxmu-dev libxi-dev libgl-dev
$ sudo apt install libegl1-mesa-dev
$ git clone https://github.com/nigels-com/glew.git
$ cd glew
$ cd auto
$ make SYSTEM=linux-egl
$ cd ../build
$ cmake ./cmake
$ cd cmake
$ make
$ sudo make install
LD_LIBRARY_PATHの設定
LD_LIBRARY_PATHを設定すべき正解の設定ファイルはどれなのだろうか?
とりあえず.bashrcに書く。
$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib' >> ~/.bashrc
$ source ~/.bashrc
サンプルコードのコンパイルに必要なコンポーネントをインストール
コンパイルに必要なコンポーネントをインストール。
$ sudo apt install -y libglu1-mesa-dev
サンプルコードをダウンロード
「グラフィックス・アプリ」制作のためのOpenGL入門 サポート情報 http://www.kohgakusha.co.jp/support/glfwopgl/index.html
からサンプルコードをダウンロードして任意のディレクトリに展開する。
サンプルコードのstep00をコンパイルして実行
コンパイル。
$ unzip sample.zip
$ cd sample
$ cd step01
$ make
g++ -g -Wall -std=c++11 -Iinclude -MM main.cpp > glfw3.dep
g++ -g -Wall -std=c++11 -Iinclude -c -o main.o main.cpp
g++ -g -Wall -std=c++11 -Iinclude main.o -Llib -lglfw3_linux -lGLEW_linux -lGL -lXrandr -lXinerama -lXcursor -lXi -lXxf86vm -lX11 -lpthread -lrt -lm -ldl -o glfw3
/usr/bin/ld: 互換性のないを lib/libglfw3_linux.a スキップしました (-lglfw3_linux を探索している時)
/usr/bin/ld: -lglfw3_linux が見つかりません
/usr/bin/ld: 互換性のないを lib/libGLEW_linux.a スキップしました (-lGLEW_linux を探索している時)
/usr/bin/ld: -lGLEW_linux が見つかりません
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: glfw3] エラー 1
???
エラーになったでごわす。
原因はMakefileの以下の部分。
LDLIBS = -Llib -lglfw3_linux -lGLEW_linux -lGL -lXrandr -lXinerama -lXcursor \
ここの、-lglfw3_linux を -lglfw3 に、 -lGLEW_linux を -lGLEW に書き換える。
もう一度コンパイル。
$ make
g++ -g -Wall -std=c++11 -Iinclude main.o -Llib -lglfw3 -lGLEW -lGL -lXrandr -lXinerama -lXcursor -lXi -lXxf86vm -lX11 -lpthread -lrt -lm -ldl -o glfw3
成功。実行してみる。
$ ./glfw3
何も起きない。まぁ、何も起きないサンプルだからだけど。
もしこの時、
./glfw3: error while loading shared libraries: libGLEW.so.2.2: cannot open shared object file: No such file or directory
(.bashrcにちゃんと書いていないか、書いたあと一旦端末を抜けていないか、sourceをしていないか)
サンプルコードのMakefileを一括修正
先程同様、全Makefileの-lglfw3_linuxと-lGLEW_linuxを修正しないといけない。いちいちやってられないので、以下のコマンドでまとめて修正。
$ cd .. (sampleディレクトリ直下に移動)
$ find ./ -name Makefile | xargs sed -i -e "s/lglfw3_linux/lglfw3/g"
$ find ./ -name Makefile | xargs sed -i -e "s/lGLEW_linux/lGLEW/g"
サンプルコードのstep01をコンパイルして実行
次はstep01をコンパイル。
$ cd ../step01
$ make
g++ -g -Wall -std=c++11 -Iinclude -c -o main.o main.cpp
g++ -g -Wall -std=c++11 -Iinclude main.o -Llib -lglfw3 -lGLEW -lGL -lXrandr -lXinerama -lXcursor -lXi -lXxf86vm -lX11 -lpthread -lrt -lm -ldl -o glfw3
実行。
$ ./glfw3
真っ白いWindowが表示された!!
もし、以下のようなエラーが出た場合。
g++ -g -Wall -std=c++11 -Iinclude -MM main.cpp > glfw3.dep
g++ -g -Wall -std=c++11 -Iinclude -c -o main.o main.cpp
In file included from main.cpp:3:
include/GL/glew.h:1205:14: fatal error: GL/glu.h: そのようなファイルやディレクトリはありません
# include <GL/glu.h>
^~~~~~~~~~
compilation terminated.
make: *** [<ビルトイン>: main.o] エラー 1
あなたは、上記手順で入れるように言った、以下のコマンドを実行していなかったのでしょう。
$ sudo apt install -y libglu1-mesa-dev
以上。