zoukankan      html  css  js  c++  java
  • Makefile编写示例:构建一个库

    1、目录结构如下:

    [root@localhost libname]# tree
    .
    +-- include
    ¦   +-- headerA.h
    ¦   +-- headerB.h
    +-- lib
    +-- Makefile
    +-- src
    ¦   +-- cppsrcA.cpp
    ¦   +-- cppsrcB.cpp
    ¦   +-- csrcA.c
    ¦   +-- csrcB.c
    +-- test
    
    4 directories, 7 files

    2、Makefile内容为:

    CC           = gcc
    CXX          = g++
    AR           = ar -r
    RM           = rm -f
    #INSTALL     = /usr/bin/install -m 644
    #INSTALL_BIN = /usr/bin/install -m 755
    
    # you can specify LIBTYPE=static when executing make, if you want to create a static library
    ifeq ($(LIBTYPE),static)
      CFLAGS     = -I./include
      CXXFLAGS   = -I./include
    else
      CFLAGS     = -I./include -fPIC
      CXXFLAGS   = -I./include -fPIC
      LDFLAGS    = -fPIC -shared
    endif
    
    C_SRC        = src/csrcA.c \
                   src/csrcB.c
                  
    CXX_SRC      = src/cppsrcA.cpp \
                   src/cppsrcB.cpp
    
    SRC_DIR      = src
    STATIC_OBJ_DIR =lib_obj/static_obj
    DYNAMIC_OBJ_DIR=lib_obj/dynamic_obj
    LIB_DIR      = lib
    
    STATIC_LIB   = libname.a
    DYNAMIC_LIB  = libname.so
    
    ifeq ($(LIBTYPE),static)
      LIB_NAME   = $(STATIC_LIB)
      OBJS_DIR   = $(STATIC_OBJ_DIR)
    else
      LIB_NAME   = $(DYNAMIC_LIB)
      OBJS_DIR   = $(DYNAMIC_OBJ_DIR)
    endif
    
    C_OBJS       = $(patsubst $(SRC_DIR)/%.c, $(OBJS_DIR)/%.o, $(C_SRC))
    CXX_OBJS     = $(patsubst $(SRC_DIR)/%.cpp, $(OBJS_DIR)/%.o, $(CXX_SRC))
    ALL_OBJS     = $(C_OBJS) $(CXX_OBJS)
    
    INSTALL_PREFIX=/usr/local/libname
    
    all: $(LIB_NAME)
    
    $(STATIC_LIB): $(OBJS_DIR) $(ALL_OBJS)
        $(AR) $(LIB_DIR)/$@ $(ALL_OBJS)
    
    $(DYNAMIC_LIB): $(OBJS_DIR) $(ALL_OBJS)
        $(CC) $(LDFLAGS) $(ALL_OBJS) -o $(LIB_DIR)/$@
    
    $(OBJS_DIR):
        @if [ ! -d $(OBJS_DIR) ]; then \
            echo mkdir -p $(OBJS_DIR) ; \
            mkdir -p $(OBJS_DIR); \
        fi
    
    $(C_OBJS):$(OBJS_DIR)/%.o:$(SRC_DIR)/%.c
        $(CC) $(CFLAGS) -c $< -o $@
    
    $(CXX_OBJS):$(OBJS_DIR)/%.o:$(SRC_DIR)/%.cpp
        $(CXX) $(CXXFLAGS) -c $< -o $@
        
    #install:
    #uninstall:
    #test:
    
    .PHONY: cleanall clean
    cleanall: clean
        $(RM) $(LIB_DIR)/$(STATIC_LIB) $(LIB_DIR)/$(DYNAMIC_LIB)
    clean:
        $(RM) $(STATIC_OBJ_DIR)/*.o $(DYNAMIC_OBJ_DIR)/*.o

    3、执行 make 和 make LIBTYPE=static 后的目录结构

    [root@localhost libname]# tree
    .
    +-- include
    ¦   +-- headerA.h
    ¦   +-- headerB.h
    +-- lib
    ¦   +-- libname.a
    ¦   +-- libname.so
    +-- lib_obj
    ¦   +-- dynamic_obj
    ¦   ¦   +-- cppsrcA.o
    ¦   ¦   +-- cppsrcB.o
    ¦   ¦   +-- csrcA.o
    ¦   ¦   +-- csrcB.o
    ¦   +-- static_obj
    ¦       +-- cppsrcA.o
    ¦       +-- cppsrcB.o
    ¦       +-- csrcA.o
    ¦       +-- csrcB.o
    +-- Makefile
    +-- src
    ¦   +-- cppsrcA.cpp
    ¦   +-- cppsrcB.cpp
    ¦   +-- csrcA.c
    ¦   +-- csrcB.c
    +-- test
    
    7 directories, 17 files
  • 相关阅读:
    CSS3实现10种Loading效果(转)
    Editorial Board 、co-editor、ediitor、editor-in-chief的区别
    Android必知必会-使用okhttp的PUT方式上传文件
    Android项目开发填坑记-so文件引发的攻坚战
    Android开发学习之路--RxAndroid之操作符
    Libgdx教程目录
    Android开发学习之路--RxAndroid之lambda
    Android开发学习之路--RxAndroid之初体验
    Android必知必会-获取视频文件的截图、缩略图
    Android开发学习之路--Annotation注解简化view控件之初体验
  • 原文地址:https://www.cnblogs.com/opangle/p/2595152.html
Copyright © 2011-2022 走看看