なんとな~くしあわせ?の日記

ClojureとかAWSの設定とかをメモする技術ブログ

OpenGLをMinGWで、依存関係なく

OpenGLCygwinから使うと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はもってないし。