MakefileのTips

提供: Akionux-wiki
Share/Save/Bookmark
移動: 案内検索

インクルードパスとライブラリパス

-Iでインクルードパスを、-Lでライブラリパスを指定することができる。

INCLUDE_PATH = -I. -I./eltopo
LIBRARY_PATH = -L. -L./eltopo
LIBS        = -lm -lglut -lGL -lGLU -leltopo_release
$(PROGRAM): $(OBJS)
	$(CC) $^ $(LDFLAGS) $(LIBS) $(LIBRARY_PATH) -o $@
.cpp.o:
	$(CC) $(CFLAGS) $(INCLUDE_PATH) -c $<

ライブラリパスにある、libhoge.aまたはlibhoge.soは-lhogeとして指定してライブラリを利用する。

拡張子を置き換える

SRC         = main.cpp
OBJS        = $(SRC:.cpp=.o)

これでソースファイルを列挙するだけでオブジェクトファイルは自動的に拡張子を.cppから.oに置き換えられたものになる。

依存関係、出力ファイルの記号

$^は依存関係全て、$<は依存関係の先頭の一つ、$@は出力ファイルを表す。

test: test.o detail.o
	$(CXX) $^ -o $@ 
test.o: test.cpp
	$(CXX) -c $<
detail.o: detail.cpp
	$(CXX) -c $<

全ての.cppから.oを生成する

.cpp.o:
        ${CXX} ${CFLAGS} -c $<

同様にcの場合は.c.oである。

フォニーターゲット

cleanのようなコマンドと同じ名前のターゲット(ファイル)が万が一存在する場合、作業が停止してしまう。そこで、フォニーターゲット(偽りのターゲット)を作成して、そのターゲットが明示的に偽りであることを示すことで同名のファイルを存在するかどうかを気にすることなくコマンドを実行できる。

.PHONY: clean
clean:
        rm $(OBJS) $(PROGRAM)