Makefile的写法

Makefile是定义编译规则的文件,可以完成自动判断,选择编译功能,亦能减少手动处理工作量。之前对Makefile总是使用最熟悉的简单方式,觉得还是需要对细节再深入了解下。
Makefile的基本功能
Makefile是用来定义编译规则的脚本文件,采用make程序可理解的格式编写,一般计算机程序能理解语言总是通过最基本的变量、运算符、顺序、条件选择、循环等语法方式来表达。由于Makefile是用于帮助编译的脚本,理解下编译的基本过程,对我们有所帮助,一般编译可分为预处理、编译扫描、汇编扫描、链接处理等过程。所谓预处理主要是头文件、宏定义等处理,所以在Makefile中编译命令有时需要携带相应的宏定义;编译扫面即需要将相应高级语言处理生成汇编语言;汇编扫面是生成相应二进制文件过程,如.obj/.o;链接处理包括生成库文件、可执行文件等,如静态.a .lib,动态dll so以及可执行的exe文件等。
Makefile编写基本规则
Make程序可以根据目标文件和源代码文件的时间变化来选择需要编译的文件,以减少全部编译所需要的工作量。其最基本的格式采用如下,其中目标文件即为中间生成目标或最终生成目标;伪目标用来表示那些没有相应生成文件的目标。伪目标的使用方法实在,相应目标依赖规则前面加上.PHONY : 目标1 目标2 ...,常见清除目标文件的make clean命令,clean即可定义为伪目标。同一语句,多行之间可以通过 \进行连接。
#此符号用来在makefile中进行注释
inlucde <filename> #用来包含其他make规则文件,如果使用-include和sinclude功能一致
目标 ...:依赖文件 ...
[tab符][@]命令 #如果带有@符号,将不回显相应make命令行
[tab符][@]命令1;命令2 #命令2依赖命令1执行后执行
...
而使用Makefile需要相应的make环境,调用时使用 make + 目标的调用方式。当然make环境可以自动推倒某些规则,如依赖.o文件,可以使用隐含规则通过相应.c来生成,在编写makefile时可以省略掉一些推导过程。
Makefile中的变量定义与传递
Makefile中的变量可以理解为c语言中的宏,赋值时使用 变量名 = ...的方式,而引用时使用 $(变量名)的表达方式。= 前面使用的变量可以在文件后面定义,而:=不可以,当然=也会带来递归问题。变量值的替换方法 x : = $(y: .o=.c)则将y中的.o换成.c后赋值给x。而由于make中的变量更像是宏,所以变量值亦可做为变量名处理。多行变量定义方式: define ... endef的方式。关于变量传递,传递变量到下级Makefile中export <variable ...>;不让变量传递到下级Makefile,使用unexport <variable ...>。Makefile中存在一些自动化变量,定义如下
Makefile中的运算符
判断/选择条件以及循环处理方式
ifeq/ifneq/ifdef/ (变量,value)
...
else
...
endif
亦可以使用if函数,循环函数foreach,具体方式参考函数调用。
函数调用
函数的基本调用方式为$(<function> <arguments>), 多个参数之间用逗号分割,常用函数如下。
隐含规则
隐含规则的作用是指不需要显示调用生成目标文件,而是make中有一些隐藏依赖规则,如.c生成.o文件;当然隐含规则可以使用不同命令重载,亦可重建依赖规则。c语言编译环境下.o文件的目标依赖可自动推导为.c文件,并且使用命令$(CC) -c $(CPPFLAGS) $(CFLAGS)。隐含规则使用到的一些命令和参数,定义如下
匹配符、通配符等特殊符号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值