makefile函数

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)
原文地址:https://www.cnblogs.com/li-daphne/p/5864806.html