Macでglfwのサンプルを動かしてハマりそうになった事
おはようございます。次男は「ママ」が未だに言えず、何でも「パパ」といいます。@kjunichiです。
背景
Rustでシダを描画したくで、gl-rsのサンプルを眺めているが、どうもこれ、OpenGLではなく、OpenGL ESで書かれいる模様。
自分はOpenGLはなんとなくユルフワで理解できるが、OpenGL ESは古くはAndroid、最近では、1世代前のKindle Fire HDでちょっと動かしたくらいで、どうにも分からないことが多い。
また、WebGLをiOS8でも使っていたりするが、これもThree.jsでラップして使っているので、glBufferなんちゃら系が今ひとつ理解出来ていない。
そんな訳で、C言語でフツーにOpenGL ESを書けないものかと探していたら、OpenGL界隈では有名な床井研究室のページでGLSLのエントリーを発見。
XCodeはできるだけ避けてる人生だった
Githubでサンプルが落とせた
git clone https://github.com/tokoik/glfwsample.git
アラフォーには、iOSの新しいのが出る度にGUIが変更されてしまうXCodeには正直付いて行きたくないので、クラシカルなMakefileを使って作業を試みた。
atom.ioで開くと、文字化けしていたので、ソースをUTF8に変換した。
MakefileがLinux向けにあったので、そのままmakeした。
% make
c++ -I/usr/X11R6/include -DX11 -Wall -c -o gg.o gg.cpp
c++ -I/usr/X11R6/include -DX11 -Wall -c -o main.o main.cpp
c++ -I/usr/X11R6/include -DX11 -Wall gg.o main.o libglfw_linux.a -L/usr/X11R6/lib -lX11 -lGL -lXrandr -lrt -lpthread -lm -o glfwsample
ld: library not found for -lrt
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [glfwsample] Error 1
となったので、-lrtをMakefileから削除したら、今度は、
ld: warning: ignoring file libglfw_linux.a, file was built for archive which is not the architecture being linked (x86_64): libglfw_linux.a
というこで、-lglfwを追加して、これでビルド出来た。
VRAMのゴミが表示される感じ
動くが画面がVRMAの領域の一部がぐしゃぐしゃっと表示される。
X11リンクしてるがXquartzが動いてないぞ
aquaで動いているから、X11関連要らなそう、というこで、Makefileを以下のようにOpenGL系はフレームワークを使うように変更
CXXFLAGS = -Wall
LDLIBS = -lglfw -lm -framework opengl
OBJECTS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
TARGET = glfwsample
.PHONY: clean depend
$(TARGET): $(OBJECTS)
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
clean:
-$(RM) $(TARGET) *.o *~ .*~ core
depend:
$(CXX) $(CXXFLAGS) -MM *.cpp > $(TARGET).dep
-include $(wildcard *.dep)
動いた。
まとめ
OSXではX11も使えるので、OpenGL系なコードは今後もリンクするライブラリに注意が必要。
-lX11 -lGL
は削除して、
-frameowrk OpenGL