http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html
通用步骤:
编译时,可以不知钉头文件,如果指定头文件,其作用是当此头文件变化时,重新生成该规则。如果不知道头文件,则当头文件改动时,只能先clean再make。
编译时,目标文件如果为dir/%.o,表示递归查找目录dir下的所有.o文件,同样的,依赖文件中如果也相应的为%.cpp,则表示查找匹配文件中的文件名为cpp文件
-----------------
编译命令:$(CC) $(CFLAGS) -c $< -o $@ 中,$< 表示依赖集,$@ 表示目标集,编译命令一般情况下可以省略。
makefile思路:
1,查找项目目录下的所有.cpp文件
2,将上面找到的变量集后缀.cpp -> .o
3, 将第二部中的变量集,一一加上debug/和release/前缀,可设为$(OUTPUT_DIR),##就是把所有的.o文件单独放到一个文件中集中管理,避免.o文件凌乱分布,如果变量为OUTPUT_OBJS
4,链接:
target:$(OUTPUT_OBJS)
$(LINK) $(OUTPUT_OBJS) $(CFLAGS) -o target $(LIB_PATH) $(LIBS)
5,编译:
$(OUTPUT_DIR)/%.o:%.cpp
$(CC) $(CFLAGS) $(INCLUDE_PATH) -c $< -o $@
#定义编译选项 CC = g++ LINK = g++ CFLAGS = -Wall #定义头文件目录,链接库目录,链接文件 INCLUDE_PATH = -Iinclude LIB_PATH = -Llib -L/usr/local/lib -Lsrc/lib LIBS = -lboost_thread -lboost_system -Llib #-ljsoncpp #定义项目代码根目录及所有文件夹目录 SRC_DIR = src VPATH = $(SRC_DIR) VPATH += $(SRC_DIR)/base VPATH += $(SRC_DIR)/data VPATH += $(SRC_DIR)/include VPATH += $(SRC_DIR)/operate VPATH += $(SRC_DIR)/operate/detail #找出所有 .cpp 文件和相应的 .o 文件(带目录) SRC_FILES = $(foreach n, $(VPATH),$(wildcard $(n)/*.cpp)) OBJ_FILES = $(SRC_FILES:.cpp=.o) #把所有的 .o 文件放到定义好的输出文件夹中统一管理 OUTPUT_DIR := debug OUTPUT_OBJS = $(addprefix $(OUTPUT_DIR)/,$(subst $(SRC_DIR)/, ,$(OBJ_FILES))) #创建存放 .o 文件的目录结构 $(shell mkdir -p "$(OUTPUT_DIR)") $(shell mkdir -p "$(OUTPUT_DIR)/base") $(shell mkdir -p "$(OUTPUT_DIR)/data") $(shell mkdir -p "$(OUTPUT_DIR)/operate") $(shell mkdir -p "$(OUTPUT_DIR)/operate/detail") #更新 ctags #$(shell ctags -R --c++-kinds=+p --fields+iaS --extra=+q .) #定义输出目标名 TARGET = server #链接 $(TARGET) : $(OUTPUT_OBJS) $(LINK) $(OUTPUT_OBJS) -o $@ $(LIB_PATH) $(LIBS) #编译 $(OUTPUT_DIR)/%.o : %.cpp $(CC) -c $< -o $@ #清除 .PHONY:clean clean: -rm -rf $(OUTPUT_DIR)/* -rm -rf $(TARGET)