Makefile 不常寫弥激,但有時候需要寫的時候,反而不知道如何下手∈臀現(xiàn)對Makefile 相關收錄如下萝衩。
Makefile 常用變量
$ @ 目標 ,^ 所有依賴 没咙,< 第一個依賴
CC c編譯器猩谊,CXX c++ 編譯器,CFLAGS c 編譯選項祭刚,CXXFLAGS c++編譯選項预柒。
Makefile 常規(guī)模板,利用makefile 的自動推導依賴
EXEC = MyTarget
CC = gcc
CFLAGS = -g -std=gnu99 -I./include/
LDFLAGS = -ltar -lrt -L./lib/
OBJS = main.o buffer.o test.o
$(EXEC):$(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
clean:
rm $(EXEC) $(OBJS)
以上Makefile 沒法檢測頭文件修改袁梗,如果工程大可以用如下Makefile 模板
####################
# $名稱: Makefile
# $時間:
####################
#1. 定義可執(zhí)行文件的名稱
TARGET = TestMyTar
#2. 指定此工程所需要頭文件路徑
INC_PATH = -I. -I./include
LIB_PATH = -L../lib/
LIBS = -lpthread -lrt
#3. 指定cpp 文件的目錄
VPATH = .:src
#4. 定義變量包含所有cpp 文件
SRC_PATH = $(foreach dir, $(subst :, ,$(VPATH)), $(wildcard $(dir)/*.cpp))
#5. 定義編譯中間文件存放路徑
OBJ_DIR = ./obj
OBJ_PATH = $(addrefix $(OBJ_DIR)/, $(subst :, ,$(VPATH)))
#6. 定義鏈接成目標 所有的obj 文件
OBJS = $(addprefix $(OBJ_DIR)/,$(subst .cpp, .o, $(SRC_PATH)))
#7. 定義依賴文件名稱
DEPS = $(OBJS:.o=.o.d)
#8. 創(chuàng)建 obj 文件存放的目錄
MAKE_OBJECT_DIR := $(shell mkdir -p $(OBJ_DIR) $(OBJ_PATH))
#9. 定義編譯器
CXX = g++
CXXFLAGS = -std=c++11 -g $(INC_PATH)
LDXXFLAGS = $(LIBS) $(LIB_PATH)
#10. 定義目標生成規(guī)則
$(TARGET):$(OBJS)
$(CXX) -o $@ $(OBJS) $(LDXXFLAGS)
#11. 定義obj 文件生成規(guī)則
$(OBJ_DIR)/%.o : %.cpp
$(CXX) $(CXXFLAGS) -o $@ -c %<
#12. 定義預編譯依賴 文件生成規(guī)則
$(OBJ_DIR)/%.o.d : %.cpp
@set -e; rm -f $@; \
$(CXX) $< -MM -std=c++11 $(INC_PATH) > $@.$$$$; \
sed 's,.*\.o[ ]*:,$(OBJ_DIR)/$*.o $@ :,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
#13. 引入編譯依賴文件
ifneq($(MAKECMDGOALS), clean)
sinclude $(DEPS)
endif
#14. clean
clean:
rm -rf ./obj
rm -rf $(TARGET)