• 第10课


    第10课 - 变量与函数的综合示例

    1. 实战需求

      (1)自动生成 target 文件夹存放可执行文件

      (2)自动生成 objs 文件夹存放编译生成的目标文件(*.o)

      (3)支持调试版本的编译选项

      (4)考虑代码的扩展性  ——> 使用变量

    2. 工具原料

      — $(wildcard _pattern)

      • 获取当前工作目录中满足_pattern的文件或目录列表

      — $(addprefix _prefix, _names)

      • 给名字列表_names中的每一个名字增加前缀_prefix

    3. 关键技巧

      — 自动获取当前目录下的源文件列表(函数调用

      • SRCS := $(wildcard *.c)  

      — 根据源文件列表生成目标文件列表(变量的值替换

      • OBJS := $(SRCS:.c=.o)  

      — 对每一个目标文件列表加上路径前缀(函数调用

      • OBJS := $(addprefix path/, $(OBJS))

    4. 规则中的模式替换(目录结构)

      — $(OBJS) : %.o : %.c 形式的模式替换对象是$(OBJS)对应的目标列表

      — %.o : %.c 形式的模式替换对象是当前工作目录

          

    5. 编译规则的依赖

      首先创建 objs 和 target 文件夹分别用来存放 .o 中间文件和可执行程序,然后创建 .o 中间文件和可执行程序,需要在前面添加前缀(放入前面创建的目录中)。

      根据$(DIRS) 、 $(OBJS)两个依赖创建文件夹和相应的 .o 文件。后面再由模式匹配生成 .o 文件。

      (自上而下的一种委派)

     1 # 考虑代码的扩展性
     2 CC := gcc
     3 MKDIR := mkdir
     4 RM := rm -rf
     5 
     6 # 存放可执行程序和中间文件的文件夹
     7 DIR_OBJS := objs
     8 DIR_TARGET := target
     9 
    10 DIRS := $(DIR_OBJS) $(DIR_TARGET)
    11 
    12 # 可执行程序
    13 TARGET := $(DIR_TARGET)/hello-makefile
    14 
    15 # .o中间文件
    16 SRCS := $(wildcard *.c)
    17 OBJS := $(SRCS:.c=.o)
    18 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
    19 
    20 .PHONY : rebuild clean all
    21 
    22 $(TARGET) : $(DIRS) $(OBJS)
    23     $(CC) -o $@ $(OBJS)
    24     @echo "Target File ==> $@"
    25 
    26 $(DIRS) :
    27     $(MKDIR) $@
    28     
    29 # 增加debug选项-g
    30 $(DIR_OBJS)/%.o : %.c
    31     ifeq ($(DEBUG),true)
    32         $(CC) -o $@ -c -g $^
    33     else
    34         $(CC) -c -o $@ $^
    35     endif
    36     
    37 rebuild : clean all
    38 
    39 all : $(TARGET)
    40 
    41 clean : 
    42     $(RM) $(DIRS)
    43     

    6. 小结

      — 目录可以成为目标的依赖,在规则中创建目录

      — 预定义函数是makefile实战时不可或缺的部分

      — 规则中的模式匹配可以直接针对目录中的文件

      — 可以使用命令行变量编译特殊的目标版本

    注:本文整理于《狄泰12月提升计划》课程内容

    狄泰QQ群:199546072     

  • 相关阅读:
    从头来之【图解针对虚拟机iOS开发环境搭建】 (转)
    换工作?请记得8、18、48与72这四个密码(转)
    php
    linux上svn连接visual svn server时ssl鉴权失败,问题解决(转)
    javamail发送邮件的简单实例(转)
    稀疏矩阵
    Redis11种Web应用场景
    说说ShellExecuteEx
    怎样从host之外连接到docker container
    hadoop日志分析
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/6885539.html
Copyright © 2020-2023  润新知