make和makefile

目录

makefile是什么?

 makefile的编写

stat查看makefile的更新

伪目标

约定俗成的伪目标

自定义变量和系统变量

makefile中自定义变量

系统变量


makefile是什么?

通常一个大型程序是由多个程序模块文件构成的,按照其功能划分,模块文件会分布在不同的目录
中。模块文件之间有包含头文件、调用函数的情况,它们之间存在依赖关系。
而makefile中就存放着这些函数的依赖关系。make命令通过解析makefile文件,自动找出变更的文件以及依赖此变更文件的相关文件,然后对所有受影响的相关文件执行事先定义好的命令规则。
注意:make命令并不是由于编译程序
其优点在于:只编译该文件和受该文件影响的相关文件,其他不受影响的文件不重新编译,从而提高了编译效率。

 makefile的编写

基本语法:

     注意:“目标”与“依赖文件列表”之间的冒号不可少。

(1)目标文件是指此规则中想要生成的文件,可以是.o 结尾的目标文件,也可以是可执行文件,也可以是个伪目标,后面会介绍伪目标
(2)依赖文件是指要生成此规则中的目标文件,需要哪些文件通常依赖文件不是一个
(3)命令是指此规则中要执行的动作,这些动作是指各种 shell 命令。命令可以有多个,但 每个命令要单独占用一行,在行首必须以 Tab 开头

示例:

有add.c,max.c,main.c三个文件,编写一个makefile实现自动编译

makefile代码:

all:main

main:add.o max.o main.o
   gcc -o main add.o max.o main.o

add.o:add.c 
   gcc -c add.c

max.o:max.c
   gcc -c max.c

main.o:main.c
   gcc -c main.c

clean:
   rm -rf *.o main

 make运行后可以直接运行main主函数:

stat查看makefile的更新

Linux 中,文件分为属性和数据两部分,每个文件有三种时间,分别用于记录与文件属性和文件数
据相关的时间,这三个时间分别是 atime,ctime,mtime。
(1) atime ,即 access stime,最近访问时间。
(2) ctime ,即 change time ,表示文件属性或数据的改变时间,每当文件的属性或数据被修改时,就会更新 ctime ,也就是说 ctime 同时跟踪文件属性和文件数据变化的时间。
(3) mtime ,即 modify time ,表示文件数据部分的修改时间,每次文件的数据被修改时就会更新 mtime 。
从概念中可以看出, mtime的变动必定伴随着ctime的改变。

 

伪目标

make规定,当规则中不存在依赖文件时,这个目标文件名就称为一一伪目标。

伪目标,顾名思义,也就是不产生真实的目标文件,所以当然也就不需要依赖文件了。于是,伪目标所在的规则就变成了纯粹地执行命令,只要给 make 指定该伪目标名做参数,就能让伪目标规则中的命令直接执行。

前面makefile中的第一行中的all就是一个伪目标。

注意:
伪目标不能和真实目标文件同名,否则就失去伪目标的意义了,为了避免伪目标和真实目标文件同名的情况,可以用关键字“ .PHONY ”来修饰伪目标。格式为“.PHONY:伪目标名”,这样不管与伪目标同名的文件是否存在, make 照样执行伪目标处的命令。

约定俗成的伪目标

all
通常用来完成所有模块的编译工作
clean
通常用于清空编译完成的所有目标文件, 一般用rm命令实现
printf
通常用于打印已经发生改变的文件
test
通常用于测试makefile流程
tar
通常用于将文件打包成 .tar 文件,也就是所谓的归档文件
dist
通常用于将打包文件后的. tar文件再压缩成 .gz文件

自定义变量和系统变量

makefile中自定义变量

makefile文件中也可以自定义变量。

变量的定义格式:变量名=值, 需要注意的是:makefile中的变量值只支持字符串形式,即使等号后面是数字,也会被作为字符串处理;此外,等号后多个值时,每个值用空格隔开。

系统变量

直接附表

makefile的规则还有很多,可以在之后的使用中不断完善。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值