Linux基础----Makefile(2)

1. Makefile中的模式规则

Makefile当中,的则个模式规则,说简单一点就是一个通配符,可以去匹配make工具可能会使用到的文件,通过使用匹配,可以优化makefile,是makefile更加灵活。
在之前那个简单的例子当中,完成了一个简单的例子,在之前使用变量对最基本的一个makefile进行了修改。在这里可以使用模式匹配来让其更加灵活。
原来的Makefile如下:

CC=gcc # 指定编译器GCC
TARGET=mp3 # 最终的目标
OBJS=main.o mp3.o # 重定位文件

$(TARGET):$(OBJS)
        $(CC) $^  -o $@ 	# 将所有的.o生成最终的可执行文件

main.o:
        $(CC) -c main.c -o main.o

mp3.o:
        $(CC) -c mp3.c -o mp3.o

.PHONY:clean


clean:
        rm mp3              

使用模式匹配来对其进行修改:

CC=gcc
TARGET=mp3
OBJS=main.o mp3.o # 重定位文件

$(TARGET):$(OBJS)
	$(CC) $^  -o $@


%.o:%.c
	$(CC) $^ -o $@ 

.PHONY:clean


clean:
	rm mp3

可以看到,使用模式匹配之后,原来的那个单个文件的编译,就用一条语句就可以了。

2. Makefile 常用函数

俺是初学,也鳖整那些有的没有的,先来简单的,常用的几个函数,那还是必须要搞懂的。

2.1 patsubst 函数

$(patsubst 匹配规则, 替换规则, 输入的字符串)

该函数实现的功能是,对于一个输入的字符串,用前面的匹配规则去进行匹配,若正确匹配到了,将匹配到的结果用替换规则进行替换。例如,下面的例子,调用patsubst函数之后,会根据输入的值,去匹配规则,匹配上之后,会将匹配到.c 文件后缀替换为.o后缀。

	echo "$(patsubst %.c, %.o, x.c.c bar.c)"

2.2 notdir函数

$(notdir 文件名)

该函数的作用就是去掉文件前面的路径名称,例如:

	echo "$(notdir src/food.c hacks.c)"

得到的结果就是去掉了文件夹名称的文件名。
在这里插入图片描述

2.3 wildcard 函数

$(wildcard 匹配规则)

wildcard函数用于获取文件列表,简单来说就是得到所有符合规则的文件。
在这里插入图片描述

2.4 foreach函数

foreach函数

$(foreach 索引, 遍历范围, 模式规则)

foreach函数一般和wildcard配合使用,通过使用这两个函数,可以完成对多个文件夹当中满足规则的文件的遍历,比如:

dirs=a b c d
files=$(foreach dir, $(dirs), $(wildcard $(dir)/*))

执行的结果,将会得到 a b c d 文件夹下的所有文件。这个函数就类似for循环。
在这里插入图片描述

3.使用函数和模式规则对Makefile进行优化

在前面的Makefile的基础上,对整个工程进行进一步的优化,使之能够和将来的工程对接上。
首先按照如下结构构件工程目录,分别是各个模块的源文件,头文件和Makefile脚本。然后就可以进行Makefile的编写了。
在这里插入图片描述

# 设定编译器
ARCH?=x86
# 生成目标
TARGET=mp3

# 存放中间文件
BUILD_DIR=build
# 存放源文件
SRC_DIR=module1 module2
# 头文件
INC_DIR=include

VPATH=$(SRC_DIR)

# 所有源文件
SOURCES=$(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))
# 所有依赖文件
INCLUDES=$(wildcard $(INC_DIR)/*h)
# 所有中间文件
OBJS=$(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SOURCES)))

# 编译指定头文件
CFLAGS=$(patsubst %, -I%, $(INC_DIR))

ifeq ($(ARCH), x86)
	CC=gcc
else
	CC=arm-linux-gnueabihf-gcc
endif

# 生成的目标文件
$(BUILD_DIR)/$(TARGET):$(OBJS)
	$(CC) -o $@ $^ $(CFLAGS)

# .o文件生成规则,依赖于所有的源文件和头文件
$(BUILD_DIR)/%.o:%.c $(INCLUDES)
	# 创建一个保存生成文件的文件夹
	mkdir -p $(BUILD_DIR)
	$(CC) -c -o $@ $< $(CFLAGS)

.PHONY:clean  
clean :
	rm -rf $(BUILD_DIR)

执行make命令之后,可以看到创建了一个build文件夹用于保存中间文件。
在这里插入图片描述


简单的Makefile就先告一段落,不得不说还是有挺多东西的,这不时不时看一下,那肯定得忘掉啊。嗨,其实都是从别人那里看的,参考地址如下:
Makefile 学习参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值