OpenGLをCygwinから使うとDLLの依存が起きてしまう。それを防ぐためCygwinの「-mno-cygwin」オプションがあるのだが、そいつはgcc-3まで。gcc-4からはmingwを呼ばなければならない。
だったらmingwでやればいいじゃん。ということなのだが世の中そううまくいかない。
例えば以下のサイトにあるサンプルコードをMinGWでコンパイルしようとしても、できない。
Cygwin¤ÇOpenGL/Glut¤ò»È¤¦ÊýË¡
これをMinGWでコンパイルするには、まずfreeglutが必要だ。最新版の2.8でも大丈夫。
The freeglut Project :: About
ソースコードをとってきたら以下のサイトを参考にしてスタティックリンクでライブラリを生成する。
Pinyo's Personal Blog: Build FreeGlut with MinGW
MinGWだと以下のように実行できる。足りないヘッダファイルはCygwinからとってくるかGoogleで調べるかする。
$ cd /usr/local/src/freeglut-2.8.0/src $ gcc -O2 -c -DFREEGLUT_STATIC *.c -I../include $ ar rcs libfreeglut32_static.a *.o
staticリンクでコンパイルするにはマクロを定義しなければいけないらしいので、コードに以下を足す
#define USE_OPENGL32
#define FREEGLUT_STATIC
参考1:c++ - OpenGL SuperBible 5th edition set-up problems - Stack Overflow
参考2:cygwinでopenglのコンパイルの仕方 - その日のうちに興味があったことを書き留めておく日記
コンパイルのコマンド
$ gcc octahedron.c -o octahedron -static -lfreeglut_static -lopengl32 -lglu32 -lgdi32 -lwinmm -mwindows
できあがったプログラムはcygwin.dllにもfreeglut.dllに依存していない。
linuxでも試してみた
Fedora15で「yum install freeglut freeglut-devel」を行った後
ソースコードはそのままで「gcc octahedron.c -o octahedron -lglut -lGLU -lGL」で以下のとおり3Dイメージが出てくる
Macでも試してみた
以下のようなMakefileを用意してビルド
CXXFLAGS = -O2 -s -Wall -fmessage-length=0 CPPFLAGS = -I/usr/X11/include OBJS = octahedron.o LIBS = -L/usr/X11/lib -lglut -lGLU -lGL TARGET = octahedron $(TARGET):$(OBJS) $(CXX) $(OBJS) $(LIBS) -o $(TARGET) $(OBJS): $(CXX) -c $(TARGET).c $(CPPFLAGS) all: $(TARGET) clean: rm -f $(OBJS) $(TARGET)
あと試してないのはAndroidぐらいか。。。BSDはもってないし。