読者です 読者をやめる 読者になる 読者になる

Makefileの書き方に関する備忘録 その3


このエントリーをはてなブックマークに追加

この記事は続き記事です。目次→Makefileの書き方に関する備忘録 - minus9dの日記

変数に何を入れるか

.cから.oへのコンパイルには以下の暗黙的なルールが使われる。

$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@

.ccから.oへのコンパイルには以下の暗黙的なルールが使われる。

$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@

これらの変数には、以下のルールに従って値を入れるのがよさそう。

  • $(CC): Cのコンパイラを指定。cc, gcc, armcc(ARM用のコンパイラ)など
  • $(CXX): C++コンパイラを指定。g++など
  • $(CPPFLAGS): C/C++共通で指定したいフラグを入れる。-I/usr/include, -O2など
  • $(CFLAGS): Cのみに関係するフラグを入れる。-std=c99など
  • $(CXXFLAGS): C++のみに関係するフラグを入れる。-Weffc++など
  • $(TARGET_ARCH): プラットフォームを指定?よくわからない


.oから実行ファイル作成には以下の暗黙的なルールが使われる。

$(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@

これらの変数にどんな値を入れるのが普通なのか、Webを検索しても正直よくわからなかった。ここでは、代表として、一番よくありそうなパターンを書いてみたいと思う。

  • $(LDFLAGS): ライブラリが置いてあるディレクトリへのパス。-L/usr/lib など
  • $(LDLIBS): ライブラリのリンク。-lml, -lhighguiなど
  • $(LOADLIBES): Re: "LOADLIBES" versus "LDLIBS"? によると、$(LDLIBS)と同じ目的の変数らしい。どうも互換性のために$(LDLIBS)と$(LOADLIBES)が併存しているようだ。$(LDLIBS)の方が覚えやすいので$(LDLIBS)を使うのが良い気がする


参考: