【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

🎁结语:

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

目录
相关文章
|
24天前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
4月前
|
Java Linux C++
【Linux】Make和Makefile快速入门
【Linux】Make和Makefile快速入门
29 0
|
4月前
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
|
5月前
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
37 0
|
5月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_5
【Linux】Linux环境基础开发工具_5
27 0
|
5月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_4
【Linux】Linux环境基础开发工具_4
34 0
|
5月前
|
Linux 开发工具 C语言
【Linux】Linux环境基础开发工具_3
【Linux】Linux环境基础开发工具_3
21 0
|
NoSQL Linux 开发工具
Linux开发工具的使用
1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.
1344 0
|
17天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
119 5
|
16天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
51 4