腾讯在做社区开放平台,在网站上提供了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
# 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))
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的重要性。希望慢慢提高。