0
点赞
收藏
分享

微信扫一扫

【Linux操作系统】自动化编译make和Makefile

Aliven888 2023-01-08 阅读 63

文章目录

一.make/makefile简介

1.什么是make,makefile?

2.为什么要有make/makefile?

二.makefile文件规则

1.基本规则

target:prerequisites
 	command

image-20230107180844759

  1. 目标:target,要生成的目标文件,往往是程序的中间文件或者最终的文件,比如test.i,test.s,test.o,test
  2. 依赖:prerequisites,目标文件由哪些文件生成,往往有的一个或多个
  3. 命令:command,通过执行该命令从依赖文件得到目标文件,需要注意命令前必须有一个[tab键],可以有多个命令,但是必须每个命令独占一行!

makefile中的[tab键]不可省略,更不可用空格代替,[tab键]不等于4个空格也不等于8个空格,1个tab键实际是4个字符,只不过代表的是4个字符.

2.举一个例子

test:test.c          #依赖关系
  gcc test.c -o test #依赖方法  
.PHONY:clean    
clean:    
  rm -rf test 
  • 这个.PHOINY是什么东西?我待会会讲到

:wq!退出vim后我们怎么用好makefile文件呐?

image-20230107182534247

3.伪目标

image-20230107183755900

4.其他规则

变量名含义
$@目标文件,可表示test
$^所有的依赖文件,可表示test.c
$<第一个依赖文件
test:test.c    
  @gcc $^ -o $@                                                                                                              
.PHONY:clean    
clean:    
  @rm -rf test

image-20230107184851539

实际上,第一我们默认第一组依赖关系和依赖方法也可以写全成: make test

只不过我们规定第一组可以省略test,只写make

三.文件三个时间问题-make程序

1.三个时间何时更新

通过stat + 文件名可以查看文件的状态:

[li@VM-8-5-centos 1-7]$ stat test.c
  File: ‘test.c’
  Size: 74        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 924282      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1002/      li)   Gid: ( 1002/      li)
Access: 2023-01-07 18:48:21.189648157 +0800
Modify: 2023-01-07 18:48:17.476581743 +0800
Change: 2023-01-07 18:48:17.476581743 +0800
 Birth: -
时间含义
Access(文件访问时间)读取文件时其改变,比如cat/less,但ls查看文件不会更新时间
Modify(文件修改时间)文件内容被编辑时其改变,比如vim/touch
Change(属性修改时间)文件属性被修改时其改变,比如mv/chmod等

image-20230107212156116

回顾一下文件属性:

Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。

-rw-rw-r-- 1 li li   62 Jan  7 18:47 Makefile
-rwxrwxr-x 1 li li 8360 Jan  7 20:55 test
-rw-rw-r-- 1 li li   74 Jan  7 18:48 test.c

2.touch的两个作用

touch test//不带选项,atime,mtime,ctime都更新
touch test -a//atime更新
touch test -m//mtime更新
touch test -c//ctime更新

3.make程序如何知道依赖文件是否更新?

image-20230107211837209

到这里我们也能解释为什么.PHONY有一个特点:被.PHONY修饰的总是能被执行,那可能就是.PHONY修饰后不再通过比较test和test.c的修改时间来判断是否要重新编译!

举报

相关推荐

0 条评论