3、Makefile

1、Makefile

  • 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。
  • Makefile 带来的好处就是“自动化编译” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个解释 Makefile 文件中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如 Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make。

2、Makefile规则

1)文件命名
makefile 或 Makefile
2)Makefile 规则:

◼ 一个Makefile文件中可以有一个或者多个规则。

目标 ...: 依赖 ...
	命令(Shell 命令)
	...
- 目标:最终要生成的文件(伪目标除外)
- 依赖:生成目标所需要的文件或是目标
- 命令:通过执行命令对依赖操作生成目标(命令前必须 Tab 缩进)
  • Makefile 中的其它规则一般都是为第一条规则服务的。
  1. 安装make:sudo apt install make
  2. 创建makefile文件:vim makefile
  3. 编辑makefile文件:
app:sub.c add.c mult.c div.c main.c
        gcc sub.c add.c mult.c div.c main.c -o app
  1. 运行makefile文件:make

◼ 命令在执行之前,需要先检查规则中的依赖是否存在
 如果存在,执行命令;
 如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令:

app:sub.o add.o mult.o div.o main.o
        gcc sub.o add.o mult.o div.o main.o -o app
sub.o:sub.c
		gcc -c sub.c -o sub.o
div.o:div.c
		gcc -c div.c -o div.o
add.o:add.c
		gcc -c add.c -o add.o
mult.o:mult.c
		gcc -c mult.c -o mult.o
main.o:main.c
		gcc -c main.c -o main.o

在这里插入图片描述

检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
 如果依赖的时间比目标的时间晚,需要重新生成目标
 如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行。

只更改add.c文件,重新make,得到如下结果:
在这里插入图片描述
只重新编译更改过的add.c文件,效率更高。

◼ 自定义变量
变量名=变量值 : var=hello

◼ 预定义变量
AR : 归档维护程序的名称,默认值为 ar
CC : C 编译器的名称,默认值为 cc
CXX : C++ 编译器的名称,默认值为 g++
$@ : 目标的完整名称
$< : 第一个依赖文件的名称
$^ : 所有的依赖文件

◼ 获取变量的值
$(变量名) ------ $(var)

◼ 变量使用

app:main.c a.c b.c
	gcc -c main.c a.c b.c

#自动变量$@$<$^只能在规则的命令中使用

#注释
app:main.c a.c b.c
	$(CC) -c $^ -o $@

◼ 模式匹配

%.o:%.c
%: 通配符,匹配一个字符串
两个%匹配的是同一个字符串

#定义变量
src=sub.o add.o mult.o div.o main.o
target=app
$(target):$(src)
	$(CC) $(src) -o $(target)

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

◼函数

  1. $(wildcard PATTERN…)
     功能:获取指定目录下指定类型的文件列表
     参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
     返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
     示例:
    $(wildcard *.c ./sub/*.c)
    返回值格式: a.c b.c c.c d.c e.c f.c

  2. $(patsubst <pattern>,<replacement>,<text>)
     功能:查找 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合
    模式<pattern>,如果匹配的话,则以<replacement>替换。
     <pattern>可以包括通配符 %,表示任意长度的字串。如果<replacement>中也包含 %,那么,<replacement>中的这个 %将是<pattern>中的那个%所代表的字串。(可以用 \来转义,以 \%来表示真实含义的 %字符)
     返回:函数返回被替换过后的字符串
     示例:
    $(patsubst %.c, %.o, x.c bar.c)
    返回值格式: x.o bar.o

#定义变量
#sub.c add.c mult.c div.c main.c
src=$(wildcard ./*.c)
#sub.o add.o mult.o div.o main.o
objs=$(patsubst %.c, %.o, $(src))
target=app

$(target):$(objs)
        $(CC) $(objs) -o $(target)

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

#自定义规则 clean  不需要依赖,用来删除.o文件  -f为某种参数
#执行make时不会执行到clean命令,需命令符执行 make clean
.PHONY:clean#表示clean是伪目标,不会生成特定文件,不需要对比依赖文件,不检测更新
clean:
	rm $(objs) -f

.PHONY:clean
#表示clean是伪目标,不会生成特定文件,不需要对比依赖文件,不检测更新

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值