项目通用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)