C++でのライブラリの読み込みに関する注意
OpenGL と GLUT を用いて C++ でゲームを作ろうとしています。
Mac で枠組みだけを記述して動作し、 surface pro 4 を購入して Virtual Box で Ubuntu の環境を整備したので、そちらでもコンパイルできるようにしました。
そのときにコンパイルがうまくできなかったときの記録です。
Mac では分割されたファイルのそれぞれに対し、
g++ -framework OpenGL -framework GLUT
を用いてコンパイルしていましたが、 Ubuntu では freeglut3, freeglut3-dev をインストールした後、
g++ -lglut -lGLU -lGL
を用いるようです。
OS = ${shell uname -s} ifeq ($(OS), Darwin) options = -framework GLUT -framework OpenGL endif ifeq ($(OS), Linux) options = -lglut -lGLU -lGL endif target: g++ $(options) a.cpp
として完成、のはずでしたが、
'glutMainLoop' に対する定義されていない参照です
という文言が大量に出力されて失敗してしまいました。
原因は、読み込むライブラリを記述する位置が間違っていたみたいです。
適当なファイル a.cpp で
g++ a.cpp -lglut -lGLU -lGL
を実行するとコンパイルできるのが、
g++ -lglut -lGLU -lGL a.cpp
とするとエラーになってしまったのでわかりました。
ld に渡すライブラリは後に書かないといけないようです。
OS = ${shell uname -s} ifeq ($(OS), Darwin) options = -framework GLUT -framework OpenGL endif ifeq ($(OS), Linux) libs = -lglut -lGLU -lGL endif target: g++ $(options) a.cpp $(libs)
として完成です。
なぜ位置を間違うとエラーになるのかまでは把握していませんが、オプションとライブラリはきちんと分けないといけないようです。