第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 [email protected] $(OBJS)
24     @echo "Target File ==> [email protected]"
25
26 $(DIRS) :
27     $(MKDIR) [email protected]
28
29 # 增加debug选项-g
30 $(DIR_OBJS)/%.o : %.c
31     ifeq ($(DEBUG),true)
32         $(CC) -o [email protected] -c -g $^
33     else
34         $(CC) -c -o [email protected] $^
35     endif
36
37 rebuild : clean all
38
39 all : $(TARGET)
40
41 clean :
42     $(RM) $(DIRS)
43     

6. 小结

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

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

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

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

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

时间: 2024-11-01 11:14:05

第10课 - 变量与函数的综合示例的相关文章

变量与函数的综合示例(九)

之前我们学习了 makefile 中的变量及函数的相关语法知识,那么我们今天就来以实际需求为例来进行实际编写.实战需求:1.自动生成 target 文件夹存放可执行文件:2.自动生成 objs 文件夹存放编译生成的目标文件(*.o):3.支持调试版本的编译选项:4.考虑代码的扩展性. 那么在进行今天的 makefile 编写之前,我们还需要了解下几个知识点:a> $(wildcard _pattern),它的作用是获取当前工作目录中满足 _pattern 的文件或目录列表:b> $(addpr

make--变量与函数的综合示例 自动生成依赖关系

一.变量与函数的示例 示例的要求1.自动生成target文件夹存放可执行文件2.自动生成objs文件夹存放编译生成的目标文件3.支持调试版本的编译选项4.考虑代码的扩展性完成该示例所需的1.$(wildcardpattern)获取当前工作目录中满足pattern的文件或目录列表2.$(addprefix,_name)给名字列表name的每一个名字增加前缀_prefix关键技巧1.自动获取当前目录下的源文件列表(函数调用) SRC : = $(wildcard *.c) 2.根据源文件列表生成目标

第10课 python 函数

今日有点晚,上午去hilston开会 广东省科学院&白俄罗斯科学院所长会议...学习了一个上午,简直收获良多..下午又多问题处理....网站又聚餐..只能回来加加班处理一下今日的内容了(不坚持,又被遗忘了),还是要坚持一下学习Python,不然真是忘记忘记再忘记,之后就不搞了... 今日我们说函数: 1. 函数 从小学-初中经常说的x = y+1 ,x,y都是有因果关系的,我们叫函数.今日我们在编程说的函数有区别的.他是一个代码的报装,当然也有因果关系.你执行/调用有相关的结果.例如: def

(struct)结构体变量作为函数参数调用的方法小结

结构体变量.结构指针变量.结构数组作为函数的参数应用实例分析 struct stud { long int num; float score; }; /*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t) { t.num=2000101; t.score=71.0; } /*结构体数组作为函数的参数,修改后的元素的成员值能返回到主调函数*/ void funar(struct stud t[]) //void funar(stru

C语言指针变量作为函数参数

0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: 1 #include <stdio.h> 2 3 void shuchu(int *p) 4 { 5 printf("%d\n", *p); 6 } 7 8 int main() 9 { 10 int a; 11 int *pa; 12 scanf("%d", &a); 13 pa = &a;

Go编程——变量、函数导出与首字母大写

Go编程--变量.函数导出与首字母大写 标识符可被 导出 以允许从另一个包访问. 同时符合以下条件即为已导出标识 1.标识符名的第一个字符为Unicode大写字母(Unicode类别"Lu"): 2.该标识符在包块中已声明或为字段名或方法名. 以程序导入gotest/even包为例 package main import ( "even" "fmt" ) func main() { i:=even.I fmt.Printf("Is %d

第7课 - 变量的高级主题(下)

第7课 - 变量的高级主题(下) 1. makefile中的环境变量(全局变量) (1)makefile中使用系统环境变量 makefile中可以直接使用系统中的环境变量(系统环境变量的本质就是全局的键值对) 如果 makefile 中定义了同名变量,那么环境变量将会被覆盖 运行 make 时指定 "-e" 选项,优先使用环境变量 1 # 测试makefile中环境变量的使用 2 3 # 例1 4 PATH := my path 5 6 test : 7 @echo "PAT

静态变量和函数、实例变量和函数以及prototype 说明

静态变量.函数 当定义一个函数后通过 “.”为其添加的属性和函数,通过对象本身仍然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数,用过Java.C#的同学很好理解静态的含义. 1 function Obj(){ 2             } 3 4             Obj.a=0; //静态变量 5 6             Obj.fn=function(){ //静态函数 7 8             } 9             conso

python笔记_magic变量和函数

前言 先扯一点背景知识 PEP8(Python Enhancement Proposal)是一份python的编码规范,链接:http://www.python.org/dev/peps/pep-0008/ 在这份编码规范中的“命名规范-命名风格”这一节的最后,提到了对几种使用前置和后置下划线的,对变量的比较特殊的命名方式: 单下划线开头:弱内部使用标识,无法被from M import *所引用 单下划线结尾:避免和python关键字冲突,可以加个后置下划线 双下划线开头:类成员变量中的私有变