前言: 本篇博客我们继续上篇Linux博客的学习,来了解工具make/makefile、以及git相关的知识,知识确实杂且多,学着当前的忘着之前的,唉!可是人生便是如此,过往的回忆逐渐模糊,现实却还逼迫着人不能停下脚步地往前走,只能希望我们,把那些美好的回忆(之前的知识)常常回味,不要走向人生末路时,脑子一片空白,那人生岂不白白走这一遭!大家加油!常回顾,再学习新知识。
背景:Linux学习到此,我们知道让一个.c的源文件生成可执行文件时,都会使用
gcc XXX.c -o XXX(可执行)
每次删除这个文件,还需要执行
rm -f XXX
你会不会觉得很麻烦,有没有一种工具,别让我每次输入这么一大串字母 ,此时make/Makefile扛着九齿钉耙大步走来,说你怎么不用我啊,我能给你解决。
make是一个命令,Makefile是一个文件
Makefile就是一个以makefile/Makefile命名的普通文件,只不过里面的语句需要按照特定的格式来书写,说的多了没卵用,我们先见识一下
是不是感受到略微的方便了,事实上,这才哪到哪,它的好处到了后面我们写些代码量庞大的项目时,优势会更加凸显。可能此时会有人说你别光说,你写的那些是啥意思啊,好下面就讲述make/makefile的原理。
温馨提示:前面vim博客没有学习的小伙伴,千万不要试图去写makefile,极有可能你在使用vim时会不知所措,包括gcc指令,如有需要请看前面博客
【Linux】想学习Linux不看这一篇你就慢了-->工具篇(一)yum、rzsz、vim
【Linux】想学习Linux不看这一篇你就慢了-->工具篇(二)gcc/g++、动静态链接(动静态库)
我看到你写的一堆了,但是啥意思,好,我们来分析下:
事实上,makefile里面写的是一堆依赖关系和依赖方法,如
mytest:test.c
gcc test.c -o mytest
gcc test.c -o mytest就是依赖方法,而mytest:test.c就是依赖关系,就是说mytest依赖于test.c,依赖方法是gcc test.c -o mytest。
对于下面
clean:
rm -f mytest
clean不依赖于任何文件,依赖方法就是rm -f mytest .PHONY:clean是说明clean是一个伪目标,也就是被.PHONY修饰的对象是一个伪目标,也就是该目标总是被执行
总是被执行什么意思?
这叫做不总被执行,即当mytest是最新的可执行程序就不需要再编译
而当test.c发生变动时,再执行make就可以执行
相对上面,总是被执行,即是管不管你是不是最新,我就一直执行
补充知识: 被.PHONY修饰可以总被执行,我懂了,但是之前为什么不能一直执行你还没说,是谁造成的? 是gcc,那么gcc是如何得知可执行是最新的,不需要编译了呢? 知识点1: stat XXX(文件名称):可以查看文件的一些属性状态,会显示有三个时间,如下:
Access:最近访问文件时间(老版操作系统可能会访问一次变化一次,但由于访问文件次数太多,且这个时间意义不大,每次更改就意味着更多次的IO影响效率,所以新版操作系统做出了优化,即一定时间或者访问一定次数Access变化一次,仅作了解) Modify:最近内容变化的时间 Change:最近文件属性变化的时间(需注意:内容的修改也会引起这个时间的变化,因为内容牵扯到文件大小,文件大小就是文件属性) 如下:
回答上面那个问题:gcc为什么知道我的可执行就是最新的不需要编译了呢? 因为gcc是经过可执行和源文件Modify时间的对比看更新来进行判断的,即如果可执行的Modify时间是最新的即源文件已经被编译不需要再进行编译,如果当源文件的Modify时间是更新的,即可执行是之前老的,源文件已经被更改,因此需要重新编译以覆盖之前的可执行。 演示如下:
这里用到了前面指令中touch的第二个作用:更新文件的修改时间 因此也便知道即被.PHONY修饰的伪目标就不遵守这个源文件与可执行对比Modify的规则了呗
上面我们形成可执行时一直使用的是make,事实上
make = make mytest
只不过make是只生成一个可执行,即第一个可执行,执行完之后就不再向后执行
Makefile推导规则:
mytest:test.o
gcc test.o -o mytest
test.o:test.s
gcc -c test.s -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
.PHONY:clean
clean:
rm -f mytest test.o test.s test.i
执行make指令的时候,会先从第一个目标文件开始,但是没有找到它的依赖文件,就会往下走,直至找到最终的依赖文件生成目标文件再回退,直至生成mytest。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
Git 是一个免费、开源的分布式版本控制系统。 它主要用于跟踪和管理软件开发项目中的源代码(文本文件)变化,但也适用于任何文件集的版本管理。事实上git就是一个版本控制器,相当于是管理我们代码的一个仓库。
核心要解决的问题: 想象一下你在写代码、写论文或者设计一个文档时:
Git 就是为了优雅地解决这些问题而生的。
而这些也离不开雷纳斯托瓦兹(第一篇Linux博客已经介绍【Linux】想学习Linux不看这一篇你就慢了-->发展背景与基本指令)他们的努力,不然怎么会有开源的git,而gitub/gitee就是在git的基础之上做出的一些网站来进行可视化的操作。
使用的指令:git clone https://gitee.com/(仓库的https协议)
使用的指令:git add XXX(文件名) / git add .
补充知识:
仓库里有个隐藏文件.gitignore里面存放了一些后缀名,也就是说这个文件里面有的后缀名,我们同步本地仓库与远端仓库时都会被省略掉。 隐藏目录.git就是我们所说的git仓库即本地仓库,同步到远端仓库的本质意思就是将git仓库中的东西同步到远端
如果远端仓库中有人更改了内容,我们此时需要将Linux中的本地仓库更正内容同步远端时不需先将远端仓库与本地仓库进行同步,之后才能进行上传,不然会报错
使用的指令:git pull
使用指令:git mv XXX XXX
使用的指令:git status
使用的指令:git rm XXX(文件名称)
使用的指令:git log
友情提示:日志我们可以随便乱写吗?当然不可以,这是用来记录每次提交的变动,例如我们在训练人工智能算法的时候,每次改动是不是都要记录一下不然到最后,改的太多你自己都不知道哪是哪,做一个有好习惯的人,这些在未来都会不知不觉的提供你意想不到的好处。
本篇博客我们介绍了解了 Linux 项目自动化构建工具 make/Makefile 和 git 的使用。Makefile 可简化编译流程,通过特定格式书写指令,实现自动编译、清理文件等功能,对于庞大项目优势显著。git 作为分布式版本控制系统,能有效管理代码版本,通过在 Gitee 创建仓库并导入 Linux,利用 git add、git commit、git push 等指令实现文件的添加、提交与远端同步,另有同步远端更改、文件重命名、查看状态及删除文件、查看日志等补充指令辅助开发。