1. 前言
如果你不知道什么是vim和gcc
请先阅读这两篇文章后再学习本节:
文章一:
vim和yum
文章二:
gcc/g++
本章重点:
本篇文章会着重讲解Linux中的
自动化构建代码工具:make/makefile
的介绍与使用,并且将再次熟悉并拓展
文件的属性相关概念和指令,最后
讲解代码管理仓库git的使用方法
在Linux下编译代码时,每次都会输入
gcc code.c -o code.exe
在删除可执行程序时,每次都会输入
rm -rf code.exe
这样非常的不方便,很麻烦,于是乎学习
自动化构建代码是很重要的,它可以提高
我们之后在Linux下编程的效率!
2. make和makefile介绍
首先,make是一条指令,而makefile是一个文件
makefile是需要自己创建的一个文件
并且makefile是一个具有特定格式的文本文件
在当前目录创建makefile文件,再用vim编辑
不要问这代码是什么意思,先写这段代码
请注意,第二行是以TAB键开头
不管你的TAB键是向后移动两格
还是四格,固定格式是以TAB开头
写好后在底行模式用wq保存并退出
在当前目录下我有一个.c文件叫csdn.c
现在我想自动化构建代码只需要
使用指令:
make
此时我们需要删除这个可执行程序
使用指令:
make clean
3. make和makefile再理解
在上面使用make指令时,其实我们执行的是
make = make mybin
输入make mybin也可以自动化构建代码
这是因为:
在首次使用make时,会从上到下扫描
makefile文件,若发现了第一个目标
文件,就会执行它,所以makefile文件中
的第一个指令可以直接使用make执行
而后面的指令的make后面需要跟特定的指令
现在将这两个代码的位置交换:
.PHONY:clean clean: rm -rf mybin mybin:csdn.c gcc csdn.c -o mybin
然后再使用make指令
此时它们的使用就交换了!
4. 伪目标的定义以及性质
在makefile文件中,我们写了这样一段代码:
.PHONY:clean clean: rm -rf mybin
.PHONY是将clean指令修饰成了伪目标
这样做有什么用?mybin没有修饰
那么clean和mybin有什么区别?
来看下面的指令:
可以发现,clean指令被修饰成伪目标后
每次使用它都会执行相应的指令
然而mybin在执行了一次后,就无法在
短时间内程序执行了
以我们目前的经验来看有两个结论:
被修饰成伪目标后,此文件总是被执行
make总是不让重新编译代码
那么为什么不是伪目标的文件
不能实时刷新呢?请看接下来的讲解
5. 文件的三个属性
在了解文件的三个属性之前
我们要先了解系统是怎样做到第二次
make的时候将我们的请求驳回的?
现在我们知道一个事实:
一点是先有源文件才有可执行程序
所以在文件第一次编写后编译代码时
此时的源文件修改时间一定是小于
生成的可执行程序文件的修改时间
所以在第二次make时,系统发现源文件
的修改时间还是小于可执行程序的
所以系统驳回了请求,然而当我们修改
了源文件后,还没有编译时,此时源文件
修改时间大于可执行程序的修改时间
所以程序会接受我们的请求!
查看文件的属性:
使用指令:
stat 文件名
这些信息你可能看的不太懂,但是没关系
我们今天的主角是红框中的三个文件属性
现在用下图来隆重介绍一下它们:
我们经常说,文件等于内容+属性
修改文件的内容可能会影响文件属性
因为增加或减少代码会影响文件的大小
然而修改文件的属性不会影响文件内容
比如修改文件的拥有者,修改文件权限等
上面的过程大家可以自行下来验证一下
这里想要带给大家的结论是:
看文件的频次是最频繁的,所以access
时间并不是实时更新的!
可以通过下面的视频来验证一下:
access时间的更新
所以现在能够解释为什么系统
不让我们频繁的进行编译代码操作了!
而伪目标的作用就是强制执行指令
6. makefile推导能力和特殊指令
在makefile文件中时常能写出有趣的代码
这里给大家举个例子:
mybin:csdn.o gcc csdn.o -o mybin csdn.o:csdn.s gcc -c csdn.s -o csdn.o csdn.s:csdn.i gcc -S code.i -o csdn.s csdn.i:csdn.c gcc -E csdn.c -o csdn.i
这段代码是什么意思呢?
首先,mybin依赖的是.o文件
但是系统中此时没有.o文件
就会执行下一条指令,但是.o文件
依赖的是.s文件,系统中此时没有.s文件
又会跳到下一条指令,以此往复直到
找到系统中存在的.c文件,再倒推回去
当然这只是做一个了解,这就是推导能力
除此之外,在makefile中还可以定义变量
target=mybin cc=gcc src=csdn.c $(target):$(src) $(cc) $(src) -o $(target) .PHONY:clean clean: rm -rf $(target)
这样写你还认识之前的代码吗?
在要替换的内容前加上$和()即可
像C语言定义变量一样编辑代码
并且,可以用$^
代表依赖关系的左边
可以用$@
代表依赖关系的右边
比如:
mybin:csdn.c gcc $@ -o $^ .PHONY:clean clean: rm -rf mybin
这里的$^就代表csdn.c
如果你不想一条指令被打印在显示器
可以在指令前加上@符号
7. git的简单介绍以及使用
git是一种代码管理器,写git程序的和
写Linux系统的是同一个人,所以Linux
可以直接和gitee或GitHub相关联!
这里使用gitee举例子:先在远端创建仓库
Linux下的gitee创建仓库
在创建好仓库后,复杂https的链接
使用指令:
git clone 链接
即可将远端仓库克隆到本地
接下来的操作和Windows上的三板斧相似:
首先在本地仓库创建一份文件:
7.1 git三板斧之add
我们在当前目录下直接输入指令:
git add 文件名 或 git add .
前者是添加特定的文件到本地仓库
后者是将当前目录下所有文件提交
输入完这条指令后,文件就已经
被添加到本地仓库了
那么怎样在本地仓库查看有哪些文件呢?
使用指令:
git status
可以发现,本地仓库中还有test.c
没有被提交到远端仓库!
7.2 git三板斧之commit
请注意,在commit时一定要输入日志
使用指令:
git commit -m "日志"
日志一定不要乱写!
日志一定不要乱写!
日志一定不要乱写!
重要的事情说三遍,有些面试官会查看
你的gitee或GitHub,就会去看日志!
比如这里我可以这样写日志:
输入此指令后,如果你是第一次输入
系统可能会让你输入邮箱和用户名密码
这时系统会将指令的格式给你显示出来
你只需要将格式中引号内的内容改成
你的自己的邮箱或用户有即可!
显示这样的内容代表成功了!
7.3 git三板斧之push
在commit输入完日志后,输入指令:
git push
将本地仓库的文件推送至远端仓库!
输入这条指令后,会显示这样的画面:
输入你自己的账号和密码即可推送成功!
请注意,账号最好输入下图红框的内容
(注意不要加上@符号)
8. 总结以及拓展
Linux下的开发工具不止于此
还有常用的调试工具gdb等等
并且make/makefile现在只是入门
要真正把make/makefile搞懂至少得用10篇博客!
所以这里只做了makefile得简单介绍,够用就行!
大家要维护好自己的gitee或GitHub
一年都百分之80都是小绿点会很加分的!
拓展阅读:关于git的历史故事:
🔎 下期预告:Linux进程概念 🔍