腾讯在做社区开放平台,在网站上提供了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)/srcLIB_DIR := $(ROOT_DIR)/libINC_DIR := $(ROOT_DIR)/include $(ROOT_DIR)/include/jsonLIBTOOL := libtoolSRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)OBJ_FILES := $(SRC_FILES:.cpp=.o)LD_LIBS := curl jsoncpp rt####################################################################### 配置生成的lib文件名称 #######################################################################LIB_NAME := openapiLIB_SUFFIX := .aLIB_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 endifall: $(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 cleanCFLAGS := -I../srcifeq ($(UST),yes)LDFLAGS := -L.. -static -lopenapi -L../lib -static -lcurl -static -ljsoncpp -lrtelseLDFLAGS := -L.. -lopenapiendif###替换通配符all: $(patsubst %.cpp,%,$(SRC));%:%.cpp g++ $(CFLAGS) -o $@ $^ $(LDFLAGS)clean: @rm -f $(patsubst %.cpp,%,$(SRC))
在这个Makefile新认识了一个函数patsubst,这个函数是替换通配符的。
本人刚刚学习Makefile,深知阅读理解优秀的Makefile的重要性。希望慢慢提高。
原文链接: https://www.cnblogs.com/westfly/archive/2010/12/14/1905259.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/18751
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!