• 项目使用Makefile编译成静态库,动态库,可执行文件的小记模板


    Makefile

    #makefile template
    
    
    #install dir            
    INSTALL_DIR_INCLUDE        := 
    INSTALL_DIR_BINARY        := 
    #
    #$(warning $(INSTALL_DIR_BINARY))
    
    
    #current-src
    
    SRC_DIR                    := $(shell pwd)
    SRC_FILES                := $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*.cc) $(wildcard $(SRC_DIR)/*.cpp)
    SRC_DIR_INCLUDE            := 
    SRC_DIR_LIBRARY            := 
    #sub-src
    VPATH                    := ./
    #$(warning $(VPATH))
    #
    #$(warning $(SRC_FILES))
    
    #target
    TARGET_NAME                := 
    TARGET_VERSION            := .1.0.0.0
    TARGET_SHARE_NAME        := lib$(TARGET_NAME).so
    TARGET_STATIC_NAME        := lib$(TARGET_NAME).a
    
    #dst
    DST_DIR_OBJECT            := $(SRC_DIR)/../obj
    DST_DIR_BINARY            := $(SRC_DIR)/../bin
    DST_DIR                    := $(DST_DIR_OBJECT) $(DST_DIR_BINARY)
    DST_TARGET_EXEC            := $(addprefix $(DST_DIR_BINARY)/, $(TARGET_NAME))
    DST_TARGET_SHARE        := $(addprefix $(DST_DIR_BINARY)/, $(TARGET_SHARE_NAME)$(TARGET_VERSION))
    DST_TARGET_STATIC        := $(addprefix $(DST_DIR_BINARY)/, $(TARGET_STATIC_NAME)$(TARGET_VERSION))
    #DST_OBJECTS            := $(SRC_DIR:%.c=%.o)
    DST_OBJECTS                := $(addprefix $(DST_DIR_OBJECT)/, $(notdir $(patsubst %.c, %.o, $(patsubst %.cc, %.o, $(patsubst %.cpp, %.o, $(SRC_FILES))))))
    #
    #$(warning $(DST_OBJECTS))
    
    
    #ld 
    LD_INCLUDE                := $(addprefix -I, $(SRC_DIR_INCLUDE))
    LD_STATIC_BINARY        := #libFoo.a
    LD_SHARE_BINARY            := pthread
    LD_STATIC_LIBRARY        := $(addprefix $(SRC_DIR_LIBRARY), $(LD_STATIC_BINARY))
    LD_SHARE_LIBRARY        := $(addprefix -L, $(SRC_DIR_LIBRARY)) $(addprefix -l, $(LD_SHARE_BINARY))
    #
    #$(warning $(LD_SHARE_LIBRARY))
    
    
    #c-flag
    CC                        := gcc
    CFLAGS                    := -g -O2 -std=c99 -Wall -MD 
    CXXFLAGS                := $(CFLAGS) -DHAVE_CONFIG_H
    LDFLAGS                    := #-Xlinker "-(" $^ -Xlinker "-)"
    ARFLAGS                    := crs #u
    #
    #$(warning $(CXXFLAGS))
    
    
    #
    all: $(DST_DIR) $(DST_TARGET_EXEC) $(DST_TARGET_SHARE) $(DST_TARGET_STATIC)
        
    #
    $(DST_DIR): clean
        @mkdir $@
    #$(info "linking '$<' ...")
    
    #
    $(DST_TARGET_SHARE): $(DST_OBJECTS) $(LD_STATIC_LIBRARY)
        $(CC) -fPIC -shared -o $@ $^ $(LD_SHARE_LIBRARY)
    
    #
    $(DST_TARGET_STATIC): $(DST_OBJECTS) $(LD_STATIC_LIBRARY)
        $(AR) $(ARFLAGS) $@ $^
        
    #
    $(DST_TARGET_EXEC): $(DST_OBJECTS) $(LD_STATIC_LIBRARY)
        $(CC) $^ -o $@ $(LD_SHARE_LIBRARY)
    
    #search vpath
    $(DST_DIR_OBJECT)/%.o:%.c
        $(CC) $(CXXFLAGS) -o $@ -c $< $(LD_INCLUDE)
        
    
    #
    build: clean
        
    #
    rebuild: build
        
    #
    install:
    #    @/bin/cp -rf $(SRC_DIR)/*.h $(INSTALL_DIR_INCLUDE)
    #    @/bin/cp -rf $(DST_TARGET_SHARE) $(INSTALL_DIR_BINARY)
    #    @chmod 0777 $(INSTALL_DIR_BINARY)$(notdir $(DST_TARGET_SHARE))
    #    @ln -s $(INSTALL_DIR_BINARY)$(notdir $(DST_TARGET_SHARE)) $(INSTALL_DIR_BINARY)$(TARGET_SHARE_NAME)
        $(info "intall done.")    
        
    # -rm -f *.*
    clean:
        $(RM) -r $(DST_DIR_OBJECT) $(DST_DIR_BINARY)
        
        
    #
    .PHONY: all build rebuild install clean
    
    
    ################################## Makefile tips ##################################
    #
    #
    #                https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
    #
    #
                            ############## 参数 ##############                  
    #    1. 头文件目录 -I 
    #        [-Idir [...]]
    #    2. 库文件目录 -L 
    #        [-Ldir [...]]
    #    3. 库文件 -l 
    #        [-llib [...]]
    #    4. 预处理(不)使用宏 -(U)D
    #        [-(U)Dmarc[=def]]
    #    5. 启用(关闭)警告    -W(all)
    #    6. 定义语言标准 -std=c1x
    #    7. 编译整合源文件为o文件, 但不连接 -c
    #    8. 输出文件 -o
    #    9. 启用调试信息 -g
    #    10.使编译器预处理结束时停止编译(用于保留预处理输出文件.i) -E
    #    11.依赖关系
    #        -M:        包含标准库的头文件依赖关系规则(默认-E开启)
    #        -MM:    同-M,不包含标准库的头文件依赖关系规则
    #        -MD:    同-M, -MF 给予-o输出.d文件(默认-E关闭)
    #        -MF:    将依赖关系写入文件
    #        -MMD:    同-MD不包含标准库的头文件依赖关系
    #    12.位置无关代码PIC(Position-Independent Code)
    #    13.动态链接库 -shared
    #    14.静态链接库 -static
    #    15.AR参数-c 创建库
    #    16.AR参数-r 插入(替换)模块
    #    17.AR参数-s 增加文件索引
    #    18.AR参数-u 平常库
    #    19.
    #
                            ############## 符号 ##############                  
    #    1. 目标符号 $@
    #    2. 依赖符号 $^ (所有不重复), $< (第一个)
    #    3. 通配符号 %
    #    4. 伪符号 .PHONY
    #    5. 追加符号 += 或 :=
    #    6. 目录搜索 VPATH(环境变量), vpath(方法变量)
    #
    #
                            ############## 函数 ##############    
    #    1. 模式匹配字符替换 patsubst
    #    2. 添加前缀函数 addprefix
    #    3. 通配符有效下的匹配列表 wildcard
    #    4. 取字符串的非路径部分 notdir
    #    5. 文件引用 -include 等价于 sinclude
    #
    #
                            ############## 注释 ##############                  
    #    1. 当连接Object文件时, 指定的写法有指定的效果
    #        'foo.o -lz bar.o' 此时bar.o有可能未引用到z库
    #    2. 多项用空格隔开(VPATH/vpath 可以用:隔开)
    #
    #
    ################################## Makefile tips ##################################

     

    cmake 设置编译程序输出的可运行程序调用当前目录下的动态链接库的方法

    #Local Libs First
    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)  
    #set(CMAKE_SKIP_BUILD_RPATH TRUE)   
    set(CMAKE_INSTALL_RPATH .)  
    set(CMAKE_LIBRARY_PATH .)
  • 相关阅读:
    让Asp.NET的DataGrid可排序、可选择、可分页
    锁的一些概念
    我在delphi7下调用微软的Web Services的心得
    CRM 之 销售功能点分析[转]
    OFFICE InfoPath 教程
    Take me to your heartMichael Learns To Rock
    NetAdvantage(WebCombo)设置说明
    WebService小记
    Fading Like a Flower Roxette
    UndividedBon Jovi
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/8159161.html
Copyright © 2020-2023  润新知