Makefileメモ
とりあえず、これだけ覚えておけば。
シンプルMakefile
CXX = g++
CXXFLAGS = -Wall
#CXXFLAGS += -O3
#CXXFLAGS += -g
LDFLAGS =
TARGET = run.x
SRCS = sub.cpp main.cpp
OBJS = $(SRCS:%.cpp=%.o)
.SUFFIXES: .cpp .o
$(TARGET): $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
.cpp.o:
$(CXX) $(CXXFLAGS) -o $@ -c $<
clean:
rm -rf *.o $(TARGET)
マクロの使用
ターゲット名: 依存ファイル名1 依存ファイル名2 ... 実行コマンド
$@ | ターゲット名 |
$< | 最初の依存ファイル名 |
$? | ターゲットより新しいすべての依存ファイル名 |
$^ | すべての依存ファイル名 |
$+ | Makefileと同じ順番の依存するファイル名 |
$* | サフィックスを除いたターゲット名 |
$% | ターゲットがアーカイブメンバだったときのターゲットメンバ名 |
シンボル
シンボル | 内容 | デフォルトの定義 |
CXX | C++コンパイルコマンド名 | g++ |
CXXFLAGS | C++コンパイルオプション | 未定義 |
CPPFLAGS | プリプロセッサ用オプション | 未定義 |
TARGET_ARCH | 未定義 | |
LDFLAGS | リンカ用オプション | 未定義 |
COMPILE.cc | C++のコンパイル実行 | $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c |
COMPILE.C | $(COMILE.cc) | |
COMPILE.cpp | $(COMILE.cc) | |
LINK.cc | C++のリンク実行 (ソースから一気に実行体を作る) |
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) |
LINK.C | $(LINK.cc) | |
LINK.cpp | $(LINK.cc) | |
LINK.o | オブジェクトファイルのリンク | $(CC) $(LDFLAGS) $(TARGET_ARCH) |
OUTPUT_OPTION | -o $@ |
ソースファイルとオブジェクトファイルのディレクトリを分けてコンパイルする方法
CXX = g++
TARGET = run.x
SRCS = main.cpp func1.cpp func2.cpp
OBJS := $(SRCS:.cpp=.o)
OBJS := $(addprefix objs/,$(OBJS))
$(TARGET): $(OBJS)
$(CXX) -o $@ $(OBJS)
objs/%.o: srcs/%.cpp
$(CXX) -c $< -o $@
clean:
rm -rf objs/*.o $(TARGET)
- 実行結果
g++ -c srcs/main.cpp -o objs/main.o
g++ -c srcs/func1.cpp -o objs/func1.o
g++ -c srcs/func2.cpp -o objs/func2.o
g++ -o run.x objs/main.o objs/func1.o objs/func2.o
g++ -c srcs/func1.cpp -o objs/func1.o
g++ -c srcs/func2.cpp -o objs/func2.o
g++ -o run.x objs/main.o objs/func1.o objs/func2.o
参考
- http://www.02.246.ne.jp/~torutk/cxx/make/gnumake.html