🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
make在执行的时候,默认是从Makefile置顶向下执行的,每次只执行一次
Make/Makefile
make
是一个用于自动构建可执行文件、程序库或者其它类型文件的工具,它通过读取一个名为Makefile
的文件来执行构建过程。Makefile
文件包含了一系列规则,规定了文件之间的依赖关系以及如何生成目标文件。
make
工具通过比较目标文件和依赖文件的时间戳来确定哪些文件需要重新编译,从而实现增量编译,提高了编译的效率。举例来说,如果你有一个C语言项目,其中有多个源文件需要编译成可执行文件,你可以使用
make
来简化编译过程。你可以创建一个Makefile
,在其中定义每个目标文件的依赖关系和编译规则,然后通过运行make
命令来执行编译。
Makefile
文件的语法比较灵活,你可以在其中使用各种命令和变量来实现复杂的编译过程控制。通常,Makefile
文件会包含一些标准的规则,比如all
用于构建所有目标文件,clean
用于清除生成的中间文件等Makefile文件格式
注释:
以
#
开头的行表示注释,用于解释Makefile
的内容。定义变量:
通过
变量名 = 值
的格式定义变量,方便在后续使用中引用。比如CC = gcc
定义了CC
变量为gcc
编译器。默认目标:
通过
all: program
指定了默认目标为program
,当执行make
命令时,会构建program
目标。目标、依赖、命令:
每个目标规则由目标、依赖和命令三部分组成。目标是要生成的文件或任务,依赖是生成目标所需要的文件或任务,命令是生成目标的具体操作。
清理目标文件:
通过
clean
目标定义了一个用于清理中间文件的规则,执行make clean
命令时会删除生成的可执行文件和中间目标文件。注意,
Makefile
中的命令必须以一个Tab键开始,而不是空格。否则make
工具会报错。事例
# 注释以 "#" 开头 # 定义变量 CC = gcc CFLAGS = -Wall -O2 # 默认目标 all: program # 目标: 依赖 # [Tab]命令 program: main.o utils.o $(CC) $(CFLAGS) -o program main.o utils.o main.o: main.c utils.h $(CC) $(CFLAGS) -c main.c utils.o: utils.c utils.h $(CC) $(CFLAGS) -c utils.c # 清理目标文件 clean: rm -f program *.o
make在执行的时候,默认是从Makefile置顶向下执行的,每次只执行一次
事例
[BCH@hcss-ecs-6176 9_12]$ cat Makefile mycode:code.c gcc code.c -o mycode .PHONY:clean clean : rm -f mycode [BCH@hcss-ecs-6176 9_12]$ make//会执行gcc code.c -o mycode make: “mycode”是最新的。 [BCH@hcss-ecs-6176 9_12]$ vim Makefile [BCH@hcss-ecs-6176 9_12]$ cat Makefile .PHONY:clean clean : rm -f mycode mycode:code.c gcc code.c -o mycode [BCH@hcss-ecs-6176 9_12]$ make//会执行 rm -f mycode rm -f mycode
.PHONY修饰,生成伪目标,这样命令就可以总是被执行
.PHONY:clean clean : rm -f mycode mycode:code.c gcc code.c -o mycode [BCH@hcss-ecs-6176 9_12]$ make mycode make: “mycode”是最新的。 [BCH@hcss-ecs-6176 9_12]$ make mycode make: “mycode”是最新的。 执行make命令时,只会被执行 gcc code.c -o mycode,如果 我们想执行 rm -f mycode,只需在终端输入make clean
make、makefile是具有依赖性的推导能力
mycode:code.o//code.o必须存在,如果不存在往下推,直到推出存在,否则命令执行错误 gcc code.o -o mycode code.o:code.s//code.s必须存在,如果不存在往下推,直到推出存在,否则命令执行错误 gcc -c code.s -o code.o code.s:code.i//code.i必须存在 gcc -S code.i -o code.s code.i:code.c//code.c必须存在,如果不存在往下推,直到推出存在,否则命令执行错误 gcc -E code.c -o code.i clean : rm -f mycode code.i code.s code.o
语法扩展
1)执行make时不回显 [BCH@hcss-ecs-6176 9_12]$ make gcc code.c -o mycode//显示依赖方法 只需要把Makefile文件更改为 mycode:code.c @gcc code.c -o mycode//在依赖方法前加@ clean : @rm mycode 注意:在makefile中注释用’#’ 例如 #mycode:code.c # @gcc code.c -o mycode # @echo "编译完成" #clean : # @rm mycode # @echo "清理成功" 2)makefile可以定义变量(这里变量也可以看成宏,和脚本语言类似) cc=gcc src=code.c target=mybin $(target):$(src) $(cc) $(src) -o $(target) clean: rm $(target) 3)makefile里面的简写 mycode:code.c gcc $^ -o $@//$^代表依赖方式中:右侧文件列表 $@代表依赖方式中:左侧的目标文件 .PHONY:clean clean: rm mycode
stat指令
stat
指令用于显示文件的详细信息,包括文件的权限、大小、创建时间、修改时间等它的基本用法如下:
stat [文件名]
事例
bch@hcss-ecs-6176:~$ stat bch.txt File: bch.txt Size: 20 Blocks: 8 IO Block: 4096 regular file Device: fc01h/64513d Inode: 2235113 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ bch) Gid: ( 1000/ bch) Access: 2024-04-21 21:51:00.614596294 +0800 Modify: 2024-04-21 21:51:00.442594341 +0800 Change: 2024-04-21 21:51:00.442594341 +0800 Birth: 2024-04-21 21:50:14.446072315 +0800
被访问:Access会被改变
更改内容:Modify会被改变
改变属性:Change会被改变
Access时间
因为这里只观察访问时间,所以删掉了其他无关的部分 [BCH@hcss-ecs-6176 9_12]$ stat code.c 最近访问:2023-09-13 20:13:41.451827601 +0800 [BCH@hcss-ecs-6176 9_12]$ cat code.c [BCH@hcss-ecs-6176 9_12]$ stat code.c 最近访问:2023-09-13 20:13:41.451827601 +0800//时间并没有改变 [BCH@hcss-ecs-6176 9_12]$ cat code.c [BCH@hcss-ecs-6176 9_12]$ stat code.c 最近访问:2023-09-13 20:13:41.451827601 +0800//时间并没有改变 一般而言,一个文件被查看的频率是非常高的 我们所看到的文件,都是在磁盘存放的,更改时间的本质:其实是访问磁盘! 如果每次查看都要更改Access时间,linux系统充满大量的访问磁盘的IO操作,变向减慢系统效率 所以呢,现在的linux新版本在更改Access时间时,添加了次数限制
如果我们直接更新一下文件时间,可以让源文件变成最新的(没有改内容)
touch 文件名//如果文件存在,该文件的时间会被改变 例如 [BCH@hcss-ecs-6176 9_12]$ make mycode make: “mycode”是最新的。 [BCH@hcss-ecs-6176 9_12]$ touch code.c//更改code.c的三种时间 [BCH@hcss-ecs-6176 9_12]$ make mycode gcc code.c -o mycode
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸