05makefile学习之两个函数和一个特殊规则clean

05makefile学习之两个函数和一个特殊规则clean

以下为相关makefile的学习文章
01makefile学习之GCC编译的四个阶段(带编译阶段、汇编阶段、-S,-c的区别)
02makefile学习之makefile的基本原则
03makefile学习之makefile的一个规则
04makefile学习之多个规则处理多个文件
05makefile学习之两个函数和一个特殊规则clean
06makefile学习之三个自动变量(@ , @,@,^,$<)和模式规则
07makefile学习之习题1
08makefile学习之习题2

前言
上一篇我们讲完多个规则编译多个程序并解决没有改动就不需要重新编译的问题。接下来讲到如何使用makefile的函数帮我们匹配对应的文件名。

1 两个函数
在makefile文件中,所以变量都是字符串的形式,所以使得我们在使用变量时不需要定义变量类型,可以直接赋值即可。下面两个函数也的参数也同理。
1)src = $(wildcard ./*.c)//实际上该函数可以认为是一个变量,里面为函数名wildcard和一个目录路径参数,代表匹配当前目录路径的所有.c文件,返回返回给src。
2)obj = $(patsubst %.c %.o $(src)) //patsubst函数代表:将src返回的值中,含有参数1".c"后缀的文件名全部换成".o"后缀。即后缀的替换。

那么上一篇的程序经过这两个函数替换后就变成了以下内容(对比上一篇):
先给上一篇makefile:

hello:hello.o add.o sub.o mul.o
	gcc hello.o add.o sub.o mul.o -o hello
hello.o:hello.c
	gcc -c hello.c -o hello.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
mul.o:mul.c
	gcc -c mul.c -o mul.o

替换后:

src = $(wildcard ./*.c) #src=helloc.c,add.c,sub.c,mul.c
obj = $(patsubst %.c,%.o,$(src)) #"%"表示匹配一个或者多个文件,参数之间是逗号分隔

ALL:hello

hello:$(obj)
	gcc $(obj) -o hello
hello.o:hello.c
	gcc -c hello.c -o hello.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
mul.o:mul.c
	gcc -c mul.c -o mul.o

2 一个特殊的规则clean
clean规则的作用:在生成可执行文件过程中,删除产生不必要的文件(例如.o文件)。
其中删除规则在命令的实现中有一个横线"-":代表删除出错时不报错。

clean:
	-rm -rf $(obj)  #注意前面第一个"-"的作用

所以我们加上clean规则后如下:

src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src)) #param bewteen is ","

ALL:hello

hello:$(obj)
	gcc $(obj) -o hello
hello.o:hello.c
	gcc -c hello.c -o hello.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
mul.o:mul.c
	gcc -c mul.c -o mul.o

clean:
	-rm -rf $(obj)

但是即使在makefile文件中增加了该行规则,它是不会帮你自动删除的,需要你收到敲命令删除,但为了删除文件错误,一般都会先敲测试命令表示模拟删除并不会真正删除,程序员比较结果正确后就正式删除,步骤如下:

//以下是在终端敲命令
//1 先模拟删除
make clean -n
//2 正确后正式删除
make clean

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较常见的Makefile编写问题。下面是一个简单的Makefile示例,可以满足您的需求: ``` # 定义变量 CC = gcc CFLAGS = -Wall -I./inc SRC_DIR1 = src1 SRC_DIR2 = src2 OBJ_DIR = obj BIN = myprogram # 获取源文件列表 SRCS1 := $(wildcard $(SRC_DIR1)/*.c) SRCS2 := $(wildcard $(SRC_DIR2)/*.c) # 将源文件列表转换为目标文件列表 OBJS1 := $(patsubst $(SRC_DIR1)/%.c,$(OBJ_DIR)/%.o,$(SRCS1)) OBJS2 := $(patsubst $(SRC_DIR2)/%.c,$(OBJ_DIR)/%.o,$(SRCS2)) # 定义规则 all: $(BIN) $(BIN): $(OBJS1) $(OBJS2) $(CC) $^ -o $@ $(OBJ_DIR)/%.o: $(SRC_DIR1)/%.c | $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ $(OBJ_DIR)/%.o: $(SRC_DIR2)/%.c | $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ $(OBJ_DIR): mkdir $(OBJ_DIR) clean: rm -rf $(OBJ_DIR) $(BIN) ``` 这个Makefile文件中,我们定义了以下变量: - `CC`:编译器 - `CFLAGS`:编译选项,包括启用所有警告和指定头文件目录 - `SRC_DIR1`、`SRC_DIR2`:两个源文件目录 - `OBJ_DIR`:目标文件目录 - `BIN`:可执行文件名 接下来,我们使用`wildcard`函数获取源文件列表,再使用`patsubst`函数将源文件列表转换为目标文件列表。 然后,我们定义了以下规则: - `all`:默认规则,编译可执行文件 - `$(BIN)`:依赖于所有的目标文件,链接成可执行文件 - `$(OBJ_DIR)/%.o`:将每个源文件编译成目标文件 - `$(OBJ_DIR)`:创建目标文件目录 - `clean`:删除所有生成的文件 最后,我们可以在命令行中使用`make`命令来编译程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值