zoukankan      html  css  js  c++  java
  • opensns 中的Makefile

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

  • 相关阅读:
    vim 配合管道过滤多行记录
    SpringBoot自动配置原理
    SpringBoot零XML配置的Spring Boot Application
    SpringBoot快速开始Hello World
    Java反射机制
    Java网络编程
    Java JDBC
    Java泛型
    Java I/O
    Java集合
  • 原文地址:https://www.cnblogs.com/westfly/p/1905259.html
Copyright © 2011-2022 走看看