Linux第七章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章「初学」C++linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

Make/Makefile

Makefile文件格式

make在执行的时候,默认是从Makefile置顶向下执行的,每次只执行一次

.PHONY修饰,生成伪目标,这样命令就可以总是被执行

make、makefile是具有依赖性的推导能力

语法扩展

stat指令

Access时间


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

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值