Windows Subsystem for Linux(Bash on Ubuntu on Windows)でOpenGL(GLUT)を使う時のメモ
Windows Subsystem for Linuxでftp://ftp.usa.openbsd.org/pub/OpenBSD/distfiles/glpng-1.45/glpng.zip内のglpng/Example/Test.cを動かしたい。 うまくいくとサンプルのpng画像がクルクル回るらしいが色々あってコケている。
準備
森北出版株式会社刊 「Springs of C」サポートwebページの9番を参考にしてインストールを行います。
動かす(動きません)
glpngを解凍してできたglpng/Example/に移動し次のコマンドを入力。
$ gcc -Wall Test.c -lglpng -lglut -lGLU -lGL
コケる
様々なエラーが出ます。
ヘッダファイルが見つからない
Test.c:9:22: fatal error: gl/glpng.h: No such file or directory #include <gl/glpng.h>
ヘッダファイルが無いそうです。よく環境を見ると/usr/include/GLとなっているためglpng/Example/Test.cの#include部分を
#include <GL/glpng.h>
とすると通りました。(#include<gl/glut.h>も存在するためこちらも#include<GL/glut.h>に直します。)
関数を呼び出していなかった
freeglut ERROR: Function <glutCreateWindow> called without first calling 'glutInit'.
glutInitが呼ばれてないらしいです。
先程参考にしたサイトの12番に解決方法が書かれています。
数学ライブラリのリンク
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libglpng.a(pngrtran.o): undefined reference to symbol 'pow@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status
pow(乗算)が定義されてないようです。手動でリンクすればいいっぽい。同じく先程参考にしたサイトの16番に詳しく解決方法が書かれています。
そもそもライブラリ側が間違っていた
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libglpng.a(glpng.o): In function `pngLoadF': glpng.c:(.text+0x1069): undefined reference to `glColorTableEXT' collect2: error: ld returned 1 exit status
libglpng.aの関数pngLoadF内でglColorTableEXTが未定義らしいです。
これはglpng/src/glpng.cが間違っているのでそこを修正してmakeし直すと通るようになります。
//(500行付近) glColorTableEXT(GL_TEXTURE_2D, GL_RGB8, cols, GL_RGB, GL_UNSIGNED_BYTE, pal);
を
glColorTable(GL_TEXTURE_2D, GL_RGB8, cols, GL_RGB, GL_UNSIGNED_BYTE, pal);
として
$ make -f Makefile.LINUX $ cd ../lib $ sudo cp libglpng.a /usr/lib/
のようにmakeするとTest.cのコンパイルが通ります。
ウィンドウが出ない
freeglut (./a.out): failed to open display ''
ディスプレイを開けないらしいです。 そもそもWindows Subsystem for LinuxはGUIを持っていない(?)ためデフォルトではウィンドウを出すことができないようです。 そのためWindows用のXサーバーを導入することでこれを解決します。
今回使用するXサーバーはXmingで公式サイトから Xming-6-9-0-31-setup.exeとXming-fonts-x-x-x-x-setup.ext(x-x-x-xはバージョン。2017/10/1現在で7-7-0-10)をダウンロードしてインストール。 インストールが終わったらWindows Subsystem for Linux側で
$ export DISPLAY=localhost:0.0
を実行するとXサーバーの準備は完了です。
これでTest.cのコンパイルと実行ができるようになりました。
補足
exportはbashを閉じるとそこで破棄されるので~/.bash_profileとか~/.bashrcに書いておかないとまたディスプレイがないってエラーが出るので忘れないようにしてください。
参考にしたサイト
- 森北出版株式会社刊 「Springs of C」サポートwebページ
- http://nobuyo.github.io/article/build-glpng-env/ (404が返ってくるため読めませんがGoogleのキャッシュが残ってるのでそれを参考にしました。)
-- 追記 --
Bash on Ubuntu on Windowsという名称は廃止されたらしいので該当箇所をWindows Subsystem for Linuxへ変更しました。