Makefile 基础(规则,目标,伪目标,自定义变量,自动化变量,模式规则)



在终端输入make命令就会调用make工具,make会在当前目录按照文件名顺序寻找Makefile文件,依次按照:GNUmakefilemakefileMakefile

如果找到其中的任何一个(通常习惯采用的文件名是Makefile),就读取并按照其中的规则执行,否则报错。

Makefile 的规则:

1、目标

Makefile的基本语法格式是:

target : prerequisites
<Tab> command

序号组成描述
1target编译目标
target既可以是目标文件,也可以是可执行文件
2prerequisites依赖关系文件,即生成target所需要的文件或者目标
3command生成target所需执行的命令

make会根据时间戳来决定哪些文件需要重新编译。对照这个规则来解释就是:在prerequisites中,如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行

2、伪目标

【伪目标】是一个【标签】,这个目标【只执行命令】,【不创建目标】,还能避免目标与工作目录下的实际文件名冲突。写法如下:

.PHONY : 标签

在实际应用中,通常会有一个【clean】目标,这个目标几乎都会被设置为【伪目标】,用于【清除】编译产生的【中间文件】和【可执行文件】。在进行源码打包或者发布的时候,先通过make clean命令清除,可得到纯净的代码文件

.PHONY : clean
<Tab> -$(RM) $(OBJ) $(EXE)

clean伪目标的命令为-rm,在rm命令前加了-,含义是如果这条命令执行失败make忽略这个错误,继续往下执行;如果不加-,则make会停止。如果一个工程连续进行两次make clean操作,那么在进行第二次clean的时候,由于相关文件已经不存在了,所以make会报错。加了-,如果clean出错,会被忽略,而不加-则不忽略。

3、自定义变量

make支持在Makefile文件中定义变量。合理使用变量,能增强Makefile文件的通用性,并简化Makefile文件编写。一般的Makefile文件编写中,通常会为源文件可执行文件以及编译参数等分别定义一个变量,并予以赋值,在编译规则中则直接引用这些变量。变量的定义赋值方法通常是:

VAR = value

在用到变量的地方,通过 美元符号$和 括号()一起来完成变量引用,如 $(VAR)

4、makefile 变量

make本身有一些特殊变量可以在Makefile 中使用,能进一步简化Makefile的编写。这些特殊变量包括:环境变量自动化变量预定义变量

4.1 环境变量

环境变量就是系统的环境变量Makefile中基本上可以直接引用几乎所有系统环境变量,比如代表当前登录用户的(USER),系统外部命令搜索路径(PATH)等,这些变量都可以直接以$(VAR)的方式引用。

4.2 自动化变量

自动化变量不用定义,且会随着上下文的不同而发生改变。make的自动化变量都是一些比较难记住的符号,都以美元符号$开头。使用了自动化变量的Makefile文件读起来会显得抽象和生涩一些。常用的make自动化变量如表:

序号自动化变量描述
1$@目标文件名
2$<目标的第一个依赖文件名
3$^目标所对应的所有依赖文件的列表,以空格分隔
4$?目标所对应的依赖文件新于目标文件的文件列表,以空格分隔
5$(@D)目标文件的目录部分(如果目标在子目录中)
6$(@F)目标文件的文件名部分(如果目标在子目录中)

4.3 预定义变量

预定义变量make的预定义变量用于定义程序名称以及传递给这些程序的参数标志位等。常见的预定义变量和描述如表:

序号预定义变量描述
1AR归档维护程序,默认值为 ar
2AS汇编程序,默认值为 as
3CCC语言编译程序,默认值为cc
4CPPC语言预处理程序,默认值为cpp
5RM文件删除程序,默认值为rm -f
6ARFLAGS传递给AR程序的标志,默认为 rv
7ASFLAGS传递给AS程序的标志,默认值无
8CFLAGS传递给CC程序的标志,默认值无
9CPPFLAGS传递给CPP程序的标志,默认值无
10LDFLAGS传递给链接程序的标志,默认值无

5、隐式规则 和 显式规则

make有一些既定的目标生成规则,称之为隐式规则。例如对于一个file.o文件,make会优先寻找同名的file.c文件,并按照gcc -c file.c -o file.o的编译规则生成file.o文件。对于不同语言,有不同的隐式规则,所以一般来说,不推荐用隐式规则。

5.1 显式规则是用户自定义的规则

在使用隐式规则有隐患的情况下,更应当使用【显式规则】,明确指定生成规则。例如前面提到的隐式规则,用【显式规则】来定义可为:

OBJ : $(SRC)
<Tab> $(CC) -o $(OBJ) -c $^


6、模式规则

如果不用【自定义变量】,还可以这么写,也称为【模式规则】:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值