Linux第七章

news/2024/10/9 3:26:00/

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

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」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.omain.o: main.c utils.h$(CC) $(CFLAGS) -c main.cutils.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.cgcc 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.cgcc 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.cgcc 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.cgcc $^ -o $@//$^代表依赖方式中:右侧文件列表    $@代表依赖方式中:左侧的目标文件
.PHONY:clean
clean:rm mycode

stat指令

stat指令用于显示文件的详细信息,包括文件的权限、大小、创建时间、修改时间等

它的基本用法如下:

stat [文件名]

事例

bch@hcss-ecs-6176:~$ stat bch.txt File: bch.txtSize: 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 +0800Birth: 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

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


http://www.ppmy.cn/news/1435125.html

相关文章

k8s使用calico网络插件时,集群内节点防火墙策略配置方法

前言 我们在内网使用k8s时,有时候需要针对整个集群的节点设置防火墙,阻止一些外部访问,或者是仅允许白名单内的ip访问,传统做法是使用firewall之类的防火墙软件,但是,使用firewall存在如下问题&#xff1a…

智能合约语言(eDSL)—— wasmtime实现合约引擎补充

1、链上下文 由于我们是应用到区块链中,所以我们需要把链的环境传递给wasmtime,这样wasmtime在运行合约的时候,就可以获取到链上数据;我们运行合约当时的环境,打包成一个变量context,传递给wasmtime。conte…

面向对象三大特征(python)

目录 1. 封装 为什么使用封装? 如何实现封装? 一个简单的封装示例 二.继承 为什么使用继承? 如何实现继承? 一个简单的继承示例 使用继承的好处 三.多态 为什么使用多态? 如何实现多态? 一个简…

STM32学习和实践笔记(20):定时器

1.定时器介绍 STM32F1的定时器一共有8个,由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。 基本定时器的功能最为简单,类似于51单片机内定…

C#编程模式之原型模式

模式介绍:各位朋友,我们继续探讨C#的编程模式,本文介绍原型模式。原型模式的本质,其实就拷贝加创建一个新的实例。那可能就会由朋友问了,这么简单的原理,直接New一个新的实例,然后把原型类赋值给…

n-gram模型

N-gram是一种基于统计的语言模型,它基于一个假设,即一个词的出现仅与它前面的N-1个词有关,而与更远的词无关。 N-gram模型通常用于自然语言处理(NLP)任务,如文本生成、文本分类、机器翻译、拼写检查和语音识别等。在N-gram模型中…

NL2SQL技术方案系列(6):金融领域知识检索,NL2SQL技术方案以及行业案例实战讲解4

NL2SQL技术方案系列(6):金融领域NL2SQL技术方案以及行业案例实战讲解4 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七…

PHP+MYSQL多条件选一通用搜索系统功能单文件7KB

通用功能: 快速填写参数用于自己的mysql数据表搜索,ajax载入数据 <?php header("content-Type: text/html; charsetUTF-8"); //error_reporting(0);$dbhost "localhost"; //数据库地址本地localhost $dbuser "chalidecom"; //数据库账号 …