腾讯在做社区开放平台,在网站上提供了SDK下载,我下载了C++版,然后看了下起C++的Makefile,分析了下,感觉还是不错的一个Makefile,于是做了下笔记。
在cpp目录下有四个目录和一个Makefile,其中example目录还有一个额外的Makefile,src中是封装的CPengyou类。
example
include
lib
src
Makefile
下面是主目录下的Makefile
代码
######################################################################
# OpenAPI C++ edtion Makefile #
######################################################################
CC := g++
######################################################################
# 配置目录 #
######################################################################
ROOT_DIR := $(shell pwd)
SRC_DIR := $(ROOT_DIR)/src
LIB_DIR := $(ROOT_DIR)/lib
INC_DIR := $(ROOT_DIR)/include $(ROOT_DIR)/include/json
LIBTOOL := libtool
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES := $(SRC_FILES:.cpp=.o)
LD_LIBS := curl jsoncpp rt
######################################################################
# 配置生成的lib文件名称 #
######################################################################
LIB_NAME := openapi
LIB_SUFFIX := .a
LIB_TARGET := lib$(LIB_NAME)$(LIB_SUFFIX)
######################################################################
# 配置编译选项 #
######################################################################
###每次调用时都会执行,无视内置规则
.PHONY: all clean example
###addprefix --make内置函数,添加前缀
LDFLAGS := -L$(LIB_DIR) $(addprefix -l,$(LD_LIBS))
CFLAGS := -O2 -Werror -DCURL_STATICLIB -I$(SRC_DIR) $(addprefix -I,$(INC_DIR))
##是否需要调试
ifeq ($(DEBUG),yes)
CFLAGS += -ggdb2 -D__DEBUG
endif
all: $(LIB_TARGET) example;
######################################################################
# 生成动态链接库 #
######################################################################
$(LIB_TARGET): $(OBJ_FILES)
$(AR) -rc $@ $(OBJ_FILES)
$(CC) -shared -fpic -o $(LIB_TARGET:.a=.so) $(OBJ_FILES) $(LDFLAGS)
@echo *********Build $@ $(LIB_TARGET:.a=.so) Successful*********
@echo
###进入测试目录,依赖于库的生成,最后编译
example: $(LIB_TARGET)
@cd example && make UST=yes ##传递了一个参数,生成静态参数
@echo ***************Build $@ Successful************
###自依赖
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $@
clean:
@echo clean...
@rm -rf $(LIB_TARGET) $(LIB_TARGET:.a=.so) $(OBJ_FILES) $(LIB_TARGET:.a=.bin)
@cd example && make clean
Makefile中用到的知识都比较常规。
用到了wildcard——通配符匹配
在example的目录下Makefile
代码
###扩展通配符
SRC := $(wildcard *.cpp)
.PHONY: all clean
CFLAGS := -I../src
ifeq ($(UST),yes)
LDFLAGS := -L.. -static -lopenapi -L../lib -static -lcurl -static -ljsoncpp -lrt
else
LDFLAGS := -L.. -lopenapi
endif
###替换通配符
all: $(patsubst %.cpp,%,$(SRC));
%:%.cpp
g++ $(CFLAGS) -o $@ $^ $(LDFLAGS)
clean:
@rm -f $(patsubst %.cpp,%,$(SRC))
在这个Makefile新认识了一个函数patsubst,这个函数是替换通配符的。
本人刚刚学习Makefile,深知阅读理解优秀的Makefile的重要性。希望慢慢提高。