项目通用Makefile

1、linux c++项目可使用以下通用Make进行编译,避免添加一个代码文件夹或者c++文件又要改写Makefile文件的麻烦,能提高开发生产效率。

2、通用项目目录结构

.
├── bin                存放编译生成的二进制文件、配置文件或者so动态库文件
├── lib                存放lib静态库
├── Makefile           Makefile文件
├── obj                存放编译临时目标文件  
├── src                存放头文件、源代码

3、Makefile内容

.PHONY: all clean

OBJ             = obj
BIN             = bin
LIB             = lib
SRC             = src

GCC             = g++
FLAGS           = -Wall -g
DEFINES         = -DLINUX

# 头文件目录
INCLUDES        = $(patsubst %,-I%, /usr/include src/rpc/autogen)

# 库文件目录
SYSLIBDIR       = /usr/local/lib
LIBDIRS         = $(patsubst %,-L%, $(LIB) $(SYSLIBDIR))

# 库文件
ICELIB          = Ice IceUtil
SYSLIB          = pthread
LIBS            = $(patsubst %,-l%, $(ICELIB) $(SYSLIB))

# 默认递归3级目录, 不编译的文件请添加到DISCARD
DISCARD         = $(wildcard $(SRC)/test/*.cpp)
OBJS            = $(patsubst $(SRC)/%.cpp,$(OBJ)/%.o, $(filter-out $(DISCARD), $(shell find $(SRC)/* -maxdepth 3 -type f -regex ".*\.cpp")))
OBJDIRS         = $(sort $(patsubst $(SRC)/%,$(OBJ)/%, $(dir $(OBJS)))) $(OBJ) $(LIB)

# 可执行文件名
EXEC            = $(BIN)/DeviceGatewayDemo_CentOS_7

all: $(OBJDIRS) $(EXEC)

$(OBJDIRS): 
    mkdir -p $@
    
$(EXEC): $(OBJS)
    $(GCC) $(OBJS) -o $@ $(LIBDIRS) $(LIBS)

# Makefile默认目标
$(OBJ)/%.o: $(SRC)/%.cpp
    $(GCC) $(INCLUDES) $(DEFINES) $(FLAGS) -c $^ -o $@

clean:
    rm -fr $(OBJ)/*
    rm -f $(EXEC)

 

posted @ 2019-04-21 23:48  挨踢淫才  阅读(208)  评论(0编辑  收藏  举报