プログラミングと絵と音楽

コンピューター科学を専攻し、絵と音楽を趣味とするエンジニアのブログです。

C++でのライブラリの読み込みに関する注意

OpenGLGLUT を用いて 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)

として完成です。
なぜ位置を間違うとエラーになるのかまでは把握していませんが、オプションとライブラリはきちんと分けないといけないようです。