【Linux取经路】基础开发工具——make(二)

简介: 【Linux取经路】基础开发工具——make(二)

📖结论

对于一个源代码,进行一次编译,得到一个可执行文件后,如果没有对源代码做任何修改,再去对源代码进行编译,make会觉得没必要,不会重新编译。

📖如何实现

一定是源文件 形成可执行文件,先有源文件,才有可执行文件,一般而言,源文件的最近修改,比可执行文件要早。如果,更改了源文件,那和之前形成的可执行文件相比,此时的源文件最近修改时间就比可执行文件新。

所以,只需要比较可执行文件的最近修改时间和源文件的最近修改时间,如果.out文件的最近修改时间晚于.c文件,就不需要重新编译。反知,则需要重新编译。

📖查看文件时间

stat mytest:查看mytest文件的有关时间。

b92875284b294ea588908e698cd76c0c.pngAccess:文件最近一次被访问的时间,查看文件内容、修改文件内容,都属于访问文件。

Modify:最近一次修改文件内容的时间。

Change:最近一次修改文件属性的时间。

这三个时间是相互关联的,有的操作可能会同时更新多个时间。例如:修改文件的内容,那这三个时间都会更新,因为修改文件内容,首先要访问该文件,其次修改后,文件的大小会发生变化,所以这三个时间都会更新。

3c81505cafa34413b1655c2f0b3107ad.png

如上图所示:修改文件内容,三个时间都更新了,但是修改文件属性,Modify没更新可以理解,为什么Access也没有更新???

正是因为对文件的各种操作,都会导致Access时间改变,早期的Linux系统,确实会随着对文件的操作,时刻更新Access时间,这些时间信息都存储在计算机的硬盘上,而硬盘都属于外部设备,进行读写操作会比较慢,过高频率的更新一个文件的Access,当整个系统在被多个用户使用的时候,就会有大量的Access更新行为,这些行为都会往硬盘中写数据,这就会导致整个系统的运行速度下降。所以,在现在的Linux中,对Access的更新策略进行了修改,维护了一个计数器,会根据Modify和Access的更新达到一定次数的时候,才会更新Access,以此来提高系统的运行效率。(注:不同系统的更新策略会有差异)

📖手动更新文件时间

touch test.c:将test.c文件的所有时间更至最新。

touch -m test.c:将test.c文件的Modify时间更至最新。

touch -a test.c:将test.c文件的Access时间更至最新。

touch -c test.c:将test.c文件的Change时间更至最新。

85b53eca358043d991e5386e886a5d98.png

📖再回到编译

是否重新编译,其实就是比较源文件和可执行文件的Modify时间。

c10e60d5dd614913af28fef4aaa89824.png

62f60348b5834cc8b35335489f800a79.png


📖结论

make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖方法进行编译。这意味着,依赖方法并不是每次都会执行。

📖.PHONY伪目标

要想让makefile文件中的依赖方法总是被执行,可以用.PHONY对相应的标签进行修饰。

.PHONY:mytest                                                                                                                                                                             
mytest:test.c
  gcc test.c -o mytest

告诉make,mytest对应的依赖方法总是被执行。

7298db1e48174a80bd6dfa003fa9d292.png

上面只是给大家演示.PHONY的作用,一般情况下,对编译操作不加.PHONY进行修饰,而是对清理操作加.PHONY修饰。

mytest:test.c
  gcc test.c -o mytest
.PHONY:clean                                                                                                                                                                              
clean:
  rm -rf mytest

📖特殊符号

  • $@:表示标签,依赖关系冒号左边的内容。
  • $^:表示依赖的文件,依赖关系冒号右边的内容。
mytest:test.c
  gcc $^ -o $@
.PHONY:clean                                                                                                                                                                              
clean:
  rm -rf mytest

📖取消执行make指令时的回显

在前面的介绍中,每次执行make指令,都会把对应的依赖方法回显出来,像下面这样:


6ed73a10aa7c48a2bc0202ac72f650f9.png

可以在makefile文件中的依赖方法前面加上@,取消回显。

mytest:test.c
  @gcc $^ -o $@
.PHONY:clean                                                                                                                                                                              
clean:
  @rm -rf mytest


87fbd0c2f22742248b4d80daaad9f411.png

🎁结语:

 今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是春人前进的动力!

目录
相关文章
|
2月前
|
算法 数据可视化 Linux
Linux内核编译:深入理解`make menuconfig`命令
Linux内核编译:深入理解`make menuconfig`命令
32 0
|
2月前
|
编译器 Linux 数据库
Linux--gcc与make
Linux--gcc与make
|
23天前
|
搜索推荐 NoSQL Linux
Linux开发工具——vim篇
Linux开发工具——vim篇
|
23天前
|
Ubuntu Linux 编译器
【Linux】4. 开发工具的使用(yum/vim)
【Linux】4. 开发工具的使用(yum/vim)
44 2
|
2月前
|
IDE Linux 编译器
【Linux】项目自动化构建工具 —— make/Makefile
【Linux】项目自动化构建工具 —— make/Makefile
|
7天前
|
Linux 开发工具 C语言
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
|
7天前
|
人工智能 数据可视化 Linux
【linux基础(五)】Linux中的开发工具(上)---yum和vim
【linux基础(五)】Linux中的开发工具(上)---yum和vim
|
1天前
|
Linux Shell 开发工具
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
8 0
|
1天前
|
Linux 数据安全/隐私保护
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)(下)
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)
9 2