第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)(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实战时不可或缺的部分

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

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

 

转载于:https://www.cnblogs.com/hoiday/p/9265722.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值