記憶

いろいろ書きます

Windows Subsystem for Linux(Bash on Ubuntu on Windows)でOpenGL(GLUT)を使う時のメモ

Windows Subsystem for Linuxftp://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 LinuxGUIを持っていない(?)ためデフォルトではウィンドウを出すことができないようです。 そのため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に書いておかないとまたディスプレイがないってエラーが出るので忘れないようにしてください。

参考にしたサイト


-- 追記 --
Bash on Ubuntu on Windowsという名称は廃止されたらしいので該当箇所をWindows Subsystem for Linuxへ変更しました。