CでOpenGLを扱う際の環境構築の一部としてglpngを導入する必要があったのでメモ。

Cygwin

普段茨の道であるこいつは案外すんなりいった。 64bit版と共存できるので新規インストールを前提にします。

コンパイル済みライブラリを利用した導入手順

  1. 32bit版インストーラーを公式からダウンロードする
  2. 作業のしやすさと必要なもののために以下のパッケージをインストールする

    • gcc-core gcc-g++ make libglut-devel libglut3 curl wget aria2 zsh git
  3. ここからglpngcygwin.zip (Cygwin用glpngコンパイル済みライブラリ)をダウンロードし、次のように配置する。

    • glpngcygwin/framework/glpng.h → /usr/include/w32api/GL
    • glpngcygwin/framework/libglpng.a → /lib/w32api
  4. OpenGL本体が入っていない場合は先ほどのページの20番に従ってインストールする

  5. 終了

コンパイル

ダウンロードしたzipに入ってるサンプル等をコンパイルして動作チェック

gcc foo.c -I/usr/include/opengl -lglpng -lglut32 -lglu32 -lopengl32

以上で導入は完了


Mac(OSX El Capitan)

続いてmac、こいつは謎が多い。

frameworkによる導入

(前述サイト内のdmgを利用し)/Library/Frameworksにglpng.frameworkというフォルダをコピーする方法です。 手順としてはこれ1つのみで、コンパイル時にオプションを付けてリンクさせるはずがうまく行かない。 ちなみにMacにはシステムのGLUTとOpenGLが存在するのでglpngのみをインストールすればいいはず。

gccまたはclangのオプションにframeworkオプションを指定しますがglpngに関してはうまく読んでくれず。

% gcc -framework OpenGL -framework GLUT -framework Foundation -framework glpng foo.c
# 略)
ld: framework not found glpng
clang: error: linker command failed with exit code 1 (use -v to see invocation)

今度はインクルードしてほしいところを直接指定。ソース側は適宜変えているものとする。

% gcc -framework OpenGL -framework GLUT -framework Foundation -I/Library/Frameworks/glpng.framework foo.c
# 略)
Undefined symbols for architecture x86_64:
 "_pngBind", referenced from:
     _main in Test-9f9366.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ヘッダは読んでるようだが、glpng.hは関数の宣言のみが行われているため、シンボル(関数本体など)がないと怒られているようす。 調べた限りでは静的ライブラリはフレームワーク本体(*.frameworkというディレクトリ)の内部にあるResouces/に格納できる仕様になっているが、今回扱っているdmgには存在しない。

ソースからコンパイル

前述のframework作戦でシンボルがないといわれたので静的ライブラリをビルド。 このままヘッダもtarballについてるやつをそのディレクトリに持ってきたほうが手っ取り早いと思う。 システムのglutやらを使う関係で多少ソースを書き換える必要あり。

 参考 : glpngをmacで使う

いざコンパイル。warningがいっぱい出るが通った。

% gcc -framework OpenGL -framework GLUT -framework Foundation foo.c libglpng.a
# 略)

ちなみに公式が配ってるくるくるは実行しても文字は出るがウィンドウが出なかった。原因調査中。 →(追記)

追記

GLUTの初期化が正しく行われていなかったのが原因。 ここを参考にmain()を修正する。


Linux (Ubuntu)

オリジナルが削除されたみたいなので代替ライブラリ(freeglut)をapt-getからインストールする。静的ライブラリ関係はmac同様ビルドすべし。

  • エラー対策: glColorTableEXTがない
% gcc Test.c -lglpng -lglut -lGL -lGLU -o example libglpng.a -lm 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libglpng.a(glpng.o): 関数 `pngLoadF' 内:
glpng.c:(.text+0x1069): `glColorTableEXT' に対する定義されていない参照です
collect2: error: ld returned 1 exit status

公式が配布しているsrc/glpng.cを修正する。 ヘッダにはglColorTableが定義されているので 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);

変更を適用後もう一度libglpng.aをコンパイルすれば正常に使えるようになる。


参考サイト