zoukankan      html  css  js  c++  java
  • 第20课

    20.0. 实验材料

    项目架构:
          makefile(08)_打造专业的编译环境
          其中各个文件的内容请自己填写。

    20.1.大型项目的目录结构(无第三方库)

        makefile(08)_打造专业的编译环境

     

    20.2.项目架构设计分析

    项目被划分为不同的多个模块

    • 每个模块用一个文件夹进行管理,文件由inc, src, makefile构成

    • 每个模块对外函数统一放置于common/inc中,如common.h xxxfunc.h

    20.3.项目目标:需要打造的编译环境

    • 工程项目中不希望源文件夹在编译时被改动(只读文件夹)

    • 在编译时自动创建文件夹(build)用于存放编译结果

    • 编译过程中能够自动生成依赖关系自动搜索到需要的文件

    • 每个模块可以拥有自己独立的编译方式

    • 支持调试版本编译选项

    20.4.解决方案

    第一阶段:将每个模块中的代码编译称为静态库文件(compile)
        makefile(08)_打造专业的编译环境
    第二阶段:将每个模块的静态库文件最终链接成最终的可执行程序(link)
        makefile(08)_打造专业的编译环境

     

    20.5.第一阶段任务

    • 完成可用于各个模块编译makefile文件

    • 完成模块的编译结果为静态库文件(.a文件)

    20.5.1.关键的实现要点

    • 自动生成依赖关系gcc -MM

    • 自动搜索需要的文件vpath

    • 将目标文件打包静态库文件(ar crs)

     

    20.5.2.模块makefile中的构成

        makefile(08)_打造专业的编译环境

     

    20.6.最终结果

    模块的编译:makefile

    .PHONY : all
    
    DIR_BUILD := /root/w_share/DT/ToBeMaster/makefile/20/build
    DIR_COMMON_INC := /root/w_share/DT/ToBeMaster/makefile/20/common/inc
    
    DIR_SRC := src
    DIR_INC := inc
    
    TYPE_INC := .h
    TYPE_SRC := .c
    TYPE_OBJ := .o
    TYPE_DEP := .dep
    
    AR := ar
    ARFLAGS := crs
    
    CC := gcc
    CFLAGS := -I$(DIR_INC) -I$(DIR_COMMON_INC)
    
    ifeq ($(DEBUG),true)
    CFLAGS += -g
    endif
    
    MODULE := $(realpath .)
    MODULE := $(notdir $(MODULE))
    DIR_OUTPUT := $(addprefix $(DIR_BUILD)/, $(MODULE))
    
    OUTPUT := $(MODULE).a
    OUTPUT := $(addprefix $(DIR_BUILD)/, $(OUTPUT))
    
    SRCS := $(wildcard $(DIR_SRC)/*$(TYPE_SRC))
    OBJS := $(SRCS:$(TYPE_SRC)=$(TYPE_OBJ))
    OBJS := $(patsubst $(DIR_SRC)/%, $(DIR_OUTPUT)/%, $(OBJS))
    DEPS := $(SRCS:$(TYPE_SRC)=$(TYPE_DEP))
    DEPS := $(patsubst $(DIR_SRC)/%, $(DIR_OUTPUT)/%, $(DEPS))
    
    vpath %$(TYPE_INC) $(DIR_INC)
    vpath %$(TYPE_INC) $(DIR_COMMON_INC)
    vpath %$(TYPE_SRC) $(DIR_SRC)
    
    -include $(DEPS)
    
    all : $(OUTPUT)
        @echo "Success! Target ==> $(OUTPUT)"
    
    $(OUTPUT) : $(OBJS)
        $(AR) $(ARFLAGS) $@ $^
    
    $(DIR_OUTPUT)/%$(TYPE_OBJ) : %$(TYPE_SRC)
        $(CC) $(CFLAGS) -o $@ -c $(filter %$(TYPE_SRC), $^)
    
    $(DIR_OUTPUT)/%$(TYPE_DEP) : %$(TYPE_SRC)
        @echo "Creating $@ ..."
        @set -e; 
        $(CC) $(CFLAGS) -MM -E $(filter %$(TYPE_SRC), $^) | sed 's,(.*).o[ :]*,$(DIR_OUTPUT)/1$(TYPE_OBJ) $@ : ,g' > $@ 

    注意:实验过程中需要自己创建build及各模块的文件夹,并将makefile中的绝对路径改为自己代码的路径


    输出结果:
    makefile(08)_打造专业的编译环境
    这里我们看到在build/common下成功生成了依赖文件和编译后的文件,并将这些.o文件打包后放入build文件夹下。


    思考:如何编写项目makefile使其能够触发模块makefile的调用,并最终生成可执行程序

     

  • 相关阅读:
    Visio使用遇到的问题
    UML类图符号 各种关系说明以及举例
    测试人员与开发人员之间的关系如何?
    linux命令学习-复制(cp,scp)
    linux服务器报Too many open files的解决方法
    QTP学习一添加默认的注释及调用外部vbs文件
    关于JAVA应用中文字体显示小方框的问题解决
    web测试方法总结
    linux命令学习-su
    Oracle定义varchar2()类型存储汉字的长度问题
  • 原文地址:https://www.cnblogs.com/hoiday/p/10301558.html
Copyright © 2011-2022 走看看