个人主页:在线OJ的阿川
大佬的支持和鼓励,将是我成长路上最大的动力
阿川水平有限,如有错误,欢迎大佬指正
Linux一系列的文章(质量分均在93分 以上)
Linux–发展、环境、指令上半场
Linux–指令下半场
Linux–权限
Linux–生态与工具
Linux–开发工具
这是目录
- 众所周知
- Makefile第一性原则
- 简写操作
- 隐藏展示依赖方法
- 深入了解
- 时间问题
众所周知
自动化构建工具是指
- make 指令
- 能够自动化 编译和自动化清除文件
- makefile 文件
- 文件中存在依赖关系和依赖方法
Makefile第一性原则
所以单个make指令 表示编译吗?
不一定,在make中它会默认 makefile文件中的第1个依赖关系为具体实现
简写操作
写依赖方法的文件名很麻烦,可不可以简写呢?
输入
$ @ 表示简写依赖方法冒号的左边文件
$ ^ 表示简写依赖方法冒号的右边文件
即 $ 锁定为依赖方法的冒号,@表示左边, ^ 表示右边
隐藏展示依赖方法
每次使用 自动化构建工具,都会展示 具体的依赖方法,若我不想 让它展示呢?
在依赖方法中加入@
深入了解
我们将深入一下,自动化构建工具是如何进行工作的?
makefile它有自己的一套依赖关系栈式结构
且在makefile中它会自动帮你保存所写内容
时间问题
make常常用于编译,那我可以一直make,一直重新编译吗?
不能的,make指令它会根据源文件和目标文件的新旧 ,判断是否需要重新执行依赖关系进行编译.
翻译成大白话:
已经编译过的文件,之后编译器会自动识别 是否编译过
若编译过了就不再编译了,因为可以节省效率,无需重新编译。
那编译器是如何做出判断的呢?
看可执行程序和源文件时间 :
若可执行程序时间大于源文件时间,则无需重新编译。
若可执行程序时间小于源文件时间,则需重新编译。
深入一点?
源文件和可执行程序新旧问题的判断,编译器会将源文件和可执行程序时间转换成时间戳,根据大小来进行比较新旧。
哦,就是时间呢?那很简单呀
不一定
时间分为:
- Access 访问的时间
- Modify 修改的时间
- Change 改变的时间
简称为ACM:A(访问)C(改变)M(修改)
修改的时间和改变的时间不是一样的吗?
不是哦,举个例子
文件等于文件内容(modify)加文档属性(change)
之前说了Linux当中,一个重要的思想就是一切皆文件
所以
modify是文件内容修改的时间
change是文档属性修改的时间
则文件内容修改,一定会引起文档属性的改变,则时间也会引起改变
即modif时间改变会影响change时间改变,但 change不一定影响modify改变
例如文档属性可能重命名一下,但不会文档内容改变。
如何进行查看时间呢?
用stat指令可以查看可执行文件和源文件的时间
深入一下?
这里发现access访问的时间并没有发生变化,这不对呀
access访问时间应该是更改的是最频繁的,为什么反而没有变化呢?
正是因为
Access访问是最频繁的,要反复写入硬盘中
若多个用户使用则效率太低了
在如今版本中设置者修改了一下,现在需要根据 modeify和change的频率来进行更改Access的记录时间或者要三四次access访问时间才能记录为一次有效的时间
这样做从而间接的提高了效率
若不想进行优化,就想全部更新时间或者指定单独的时间进行更新,可以吗?
touch 更新已有的文件
- -m对 modify单独进行更新
-
若该文件未存在,则会新建文件
-
若已存在,则会将时间全部进行更新。
-
注意:当时间全部进行更新后即make可以重新进行编译.
这样好麻烦呀,能不能找个一劳永逸的方法就让它重新自动化构建,而不是一直用touch进行更新时间?
可以的
在makefile下输入伪目标.PHONY
- 告诉编辑器总是放它通行
但是不建议将伪目标放入编译实现中,而常常将伪目标放入清理实现中来
因为就算将伪目标放入编译中,编译器总是放它通行即重新编译
但该重新编译是在可执行程序上新增内容编译,这可能导致老的问题依旧还有。
所以常常将伪目标放入清理实践中
因为当清洗了数据之后 再重新编译
即完全先删除可执行程序, 再重新创建重新编译可以有效避免老的问题。
好的,到此为止啦,祝您变得更强
想说的话
实不相瞒,写的每篇博客都要写五六个小时(加上自己学习和纸质笔记,共八九小时吧),很累,希望大佬支持下吧
道阻且长 行则将至 |
---|
个人主页:在线OJ的阿川大佬的支持和鼓励,将是我成长路上最大的动力