要努力,但不要着急,繁花锦簇,硕果累累,都需要过程!
目录
1.Linux软件包管理器yum
2.Linux编辑器—vim的使用
2.1vim的基本概念:
2.2vim的基本操作:
2.3vim正常模式命令集:
2.4vim底行模式命令集:
2.5关于vim的配置:
3.Linux编译器-gcc/g++的使用
3.1gcc如何完成?
4.Linux项目自动化构建工具—make和makefile
5.Linux第一个小程序—进度条
5.1行缓冲区的概念
5.2倒计时小程序
5.3进度条小程序
6.使用git命令行
7.Linux调试器—gdb使用
总结
1.Linux软件包管理器yum
1.如何安装软件?
yum install (-y) + 安装的软件名
-y:表示安装的时候不需要进行询问是否需要安装
1.1.软件安装举例:lrzsz
软件的功能:支持Windows操作系统和Linux操作系统之间进行文件互传
rz:将Windows操作系统的文件传输到Linux操作系统中
sz: 将Linux操作系统的文件传输到Windows操作系统中
2.如何查找安装包?
yum list
3.如何删除安装包?
yum remove(-y) + 删除的软件名
-y:表示删除的时候不需要进行询问是否需要删除
2.Linux编辑器—vim的使用
2.1vim的基本概念:
vim是Linux中的编辑器,使用vim这个工具可以使在Linux中编辑代码更加便捷高效
既然vim用来编辑代码的工具,那如何使用vim呢?
1.创建文件
2.使用vim打开文件,然后进行编辑
使用vim打开文件——默认界面:
2.2vim的基本操作:
上面我们已经可以使用vim打开一个文件了,那如何使用vim进行编辑代码呢?
想要使用vim进行编辑代码,首先需要了解vim的三种模式:正常模式,插入模式,底行模式
正常模式:vim打开时的默认模式
插入模式:可以进行编辑代码
底行模式:用来退出vim工具
了解了三种模式后,该如何正确转换,使用vim写出代码呢?
正常模式转换插入模式:输入i或a或o
插入模式转换正常模式:按左上角键盘Esc键
正常模式转换底行模式:输入冒号“ :”
底行模式转换正常模式:按左上角键盘Esc键
注:插入模式和底行模式不能进行相互转换
下面我们就可以使用vim编写一段代码了:
2.3vim正常模式命令集:
1.光标定位:
$:移动到光标所在的行尾
^:移动光标到所在行的行首
G:光标移动到末尾
gg:光标移动到最开始
n + G:跳转光标到指定行,n代表行数
2.移动光标:可以使用键盘的上下左右键或者H J k L键
3.复制/删除文本:
yy:复制光标所在行的内容
p:粘贴所复制的内容
dd:删除光标所在行
注:nyy或npp或ndd:支持对文本内容进行多行复制或粘贴或删除(n代表行数)
ndd + p:剪贴操作(n代表行数)
4.撤销操作:
u:撤销上一步操作
ctrl + r:恢复上一步的撤销
5.文本编辑:
~:可以进行文本内容的大小写转换
R:批量化替换
r:替换一个字符
nr:可以同时替换n个字符(n代表个数)
x:行内向后删除
X:行内向前删除
注:支持nx或nX,同时删除n个字符(n代表个数)
6.更改:
cw:更改光标所在处的字到字尾处
ncw:更改n个字
2.4vim底行模式命令集:
set nu :设置行号
set nonu:取消行号
w:表示写入
w!:表示强制写入
q:表示退出
q!:表示强制退出
wq:表示保存并退出
vs:可以同时打开两个文件在同一个屏幕上
注:虽然可以在同一个屏幕上打开两个文件,但是光标只有一个,光标移动到哪个位置,就进行编辑哪个位置的代码,光标在不同文件切换Ctrl ww
!+命令:可以不用退出vim就可以执行命令
%s///g:指定文本全替换:
替换前:
替换后:
2.5关于vim的配置:
上面我们已经可以通过vim编辑器编写代码了,但是编写的时候会发现,很不好用,比如在写代码的时候没有自动补齐,自动换行,自动缩进等……这是因为默认的vim工具是没有任何的配置的,需要进行手动配置:
vim普通配置:需要通过网上搜素指令一一进行配置
1.需要在自己家目录下创建一个文件:.vimrc
2.使用vim打开进行配置:
3.配置的指令可以在网上进行搜索
vim一键配置:一键配置链接
安装完成后的界面演示:
3.Linux编译器-gcc/g++的使用
上面我们已经可以熟练的使用vim工具编写代码了,但是当我们写好代码后该如何将代码编译成可执行程序呢?
下面介绍两个工具:gcc和g++,分别用来将C语言和C++语言编写成可执行程序
3.1gcc如何完成?
格式:gcc + 要编译的文件
gcc将代码变成可执行程序会执行4个阶段:预处理,编译,汇编,生成可执行程序
预处理:
功能:头文件的展开,去注释,宏替换,条件编译等
预处理指令是以#开头的代码行
实例:gcc -E test.c -o test.i
选项:"-E"的功能是在预处理之后停止编译过程
选项:"-o"是将test.c文件指明为test.i,".i"是经过预处理的C原始程序
编译:
功能:将代码翻译成汇编语言,然后停下来
实例:gcc -S test.i -o test.s
-S:编译生成汇编代码
-o:"-o"是将test.i文件指明为test.s
汇编:
功能:将编辑阶段生成的.s文件转换成可重定向的目标二进制文件
实例:gcc -c test.s -o test.o
-c:从现在开始,生成目标二进制文件就停下来
-o:将test.s文件指明为test.o
链接:
功能:将自己写的代码和引用库的函数链接起来,生成可执行的二进制程序
实例:gcc test.o -o test
上述步骤中,在最后一个链接阶段会将自己写的代码和引用的库函数链接起来,那这些库函数是什么呢?如何使用这些库函数呢?这些库函数又存在在哪里呢?
库函数:是已经在库当中实现好的,使用的时候只需要调用就可以了。
如何使用库函数呢?
使用库函数时,只需要包含相对应的头文件就可以了,如:使用printf函数时需要包含头文件#include<stdio.h>
库函数又存在在哪里呢?
库函数存在函数库中,函数库一般分为静态库和动态库
动态库:使用动态库,这个链接过程就叫做动态链接
静态库:使用静态库,这个链接过程就叫做静态链接
举个简单的例子:上网
现在你有上网的需求,但是家里没有电脑,需要到网吧上网,到网吧上网的这个过程就可以理解为动态链接,使用网吧的电脑就可以理解使用动态库;
现在你觉得使用一直到网吧使用电脑不方便,然后就在家里买了一台电脑,在家里上网这个过程可以理解为静态链接,使用家里的电脑可以理解为使用静态库;
通过这个例子可以得出一个结论:静态链接的本质就是一份拷贝,相当于例子中的在家里买一台电脑,而动态链接是在使用的时候到指定的地方使用就可以了,相当于例子当中的到网吧上网,不需要进行拷贝
通过动态链接和静态链接的特性可以总结出它们的优缺点:
动态链接的优点:形成的可执行程序小,节省内存,磁盘和网络资源
动态链接的缺点:当库升级或删除时不能再使用
静态链接的优点:不受库升级等影响
静态链接的缺点:形成的可执行程序大,会消耗很多资源
下面通过指令来观察一下动态链接和静态链接:
1.形成一个可执行程序:
2.通过file指令观察是动态链接还是静态链接:
注:在Linux在生成的可执行程序默认是动态链接的
那如何使用静态库呢?
1.首先需要安装静态库,因为默认不包含静态库
安装指令:sudo yum install -y glibc-static
2.
如何区分动态库还是静态库?
动态库:是以.so为结尾的
静态库:是以.a为结尾的
静态链接程序和动态链接程序的区别:
通过图片可以观察出静态链接所占内存远远大于动态链接形成的二进制程序
注:关于g++完成程序的编译与gcc过程相同
4.Linux项目自动化构建工具—make和makefile
make和makefile是什么?
make:是一条命令
makefile:是一个文件
make和makefail的作用是什么?
make的作用:执行makefile文件里面的内容
makefile的作用:在makefile中编写源文件生成对应的可执行程序的指令
make和makefile如何使用?
在使用之前首先应该理解在makefail中编写指令遵循依赖关系和依赖方法的原则
举例说明:依赖关系和依赖方法
假设找你爸打电话要钱,这说明你和你爸之间存在依赖关系,当你给你爸说“我要钱”这句话就是依赖方法
了解了依赖关系和依赖方法之后,接下来就看看Linux系统中如何使用的:
1.创建一个makefile文件:
2.用vim打开makefile文件编写指令:
3.使用make命令执行makefile里面的内容:
4.可以生成可执行程序,那如何清理生成的可执行程序呢?
现在可以使用make指令和makefile文件生成和删除对应的可执行程序了,但是在清理文件时在makefile中写的.PHONY又是什么呢?
.PHONY:是一个关键字用来修饰对象clean,表示这个对象是一个伪目标
伪目标:该目标总是被执行
下面通过指令现象再解释:
使用make指令时如果第一次已经形成了可执行程序,该源文件(test.c) 没有再被更改,则不会再执行make指令。
相对于make指令,make clean指令总是能被执行,这就是.PHONY这个关键字修饰的作用,使得clean这个对象总是被执行
再这里有一个小问题就是第一次生成可执行程序后,gcc为什么知道不需要在重新编译了呢?
关于这个问题来介绍一下文件的三个时间:Access Modify Change
Modify:内容被修改的时间
Change:属性修改时间
Access:文件访问时间
Modeify:
源文件修改之前:
源文件修改之后:
通过两图对比在内容修改后,Modify的时间就被改变了
Change:
属性修改之前:
属性修改之后:
通过两图对比,属性被修改之后,Change的时间就被改变了
Acess:
访问之前:
访问之后:
通过两图对比,访问前后时间Access时间发生了改变
注:如果连续频繁访问文件内容,Access时间不会发生改变,在底层中Acess时间的改变有一定的时间间隔
了解了以上三个时间就可以回答,为什么gcc将第一次编译好的可执行程序不会再进行编译第二次了,是通过Modify的时间对比来进行判断的,因为可执行程序的生成一定依赖于源文件,所以源文件的Modify时间肯定比可执行程序时间早,gcc在编译的时候对比源文件和可执行程序的Modify的时间来确定是否需要重新生成可执行程序
所以.PHONY修饰后能够被一直执行是因为忽略了通过Modfiy时间进行判断的准则
注:make命令执行makefile中的命令默认从第一条开始,执行完一条命令之后就停下来!
makefile的推导规则:
执行make命令时根据依赖关系从后往前执行makefile中的命令:
5.Linux第一个小程序—进度条
上面我们已经掌握了如何在Linux上使用vim进行编辑,下面就尝试着通过所掌握的工具在Linux上写一个小程序—进度条
5.1行缓冲区的概念
下面先来看一段现象:
这是什么原因呢?
是因为我们写的代码默认放到缓冲区里面,图一中有‘\n’,‘\n’的作用是告诉缓冲区我的代码已经写完了,不用在等了,直接将代码显示到显示器上,图二没有‘\n’,缓冲区就一直在等,直到程序运行结束的时候,才会将缓冲区的内容显示到显示器上!
解决方法:使用fflush(stdout)刷新缓冲区中的内容
5.2倒计时小程序
通过这个小程序再来了解一下回车和换行的概念:
这段小程序是10秒倒计时,但是打印到显示器上是从上往下打印的,如何将程序在同一个地方进行打印呢?
解决方案:将‘\n’换成‘\r’,然后再刷新一下缓冲区里面的内容就ok了!
为什么将‘\n’,换成‘\r’就可以了呢?
因为‘\n’表示:换行并且回到下一行的最开始!
‘\r’表示:回到光标所在行的最开始!
5.3进度条小程序
有了上面的只是铺垫,下面就可以正式编写进度条小程序了
1.建立三个文件:main.c,process.c,process.h
2.写一个makefile:
编译成功:
3.代码编写:
process.c
process.h:
6.使用git命令行
1.什么是git?
git:叫版本控制器,是一个工具,可以用来上传代码进行备份!
gitee和github是一个网站
2.安装git:
yum install -y git
3.在gitee上创建一个仓库:
4.将创建好的仓库克隆到本地:
5..gitignore文件介绍:
凡是在这个文件内部的后缀,对应的文件,都不会被上传到gitee上去
注:gitignore中文件的内容可以自己修改,如不想上传.sln文件,可以增加.sln,在上传的时候默认就不会上传.sln的文件了
6..git介绍:
.git就是本地仓库,本质就是一个目录,上传代码push的时候就是将.git中的内容同步到gitee上
7.git add .:
将代码放到.git中
8.git commit -m '提交说明'
将代码提交到.git中
注:第一次再提交的时候会注册自己的用户名和邮箱:
9.git push
将代码推送到远端仓库gitee上
10.git其它命令
git log:查看提交日志
git mv:重命名
git pull:同步内容
git status:查看文件状态
7.Linux调试器—gdb使用
上面我们已经学习了如何在Linux操作系统上使用vim进行编写代码,以及在使用gcc.g++编译代码,除此之外当我们编写代码出现问题时,该如何进行调试呢?
下面来介绍一个新的工具gdb,可以使用这个工具进行代码的调试:
1.gdb工具安装:
yum install -y gdb
2.开始调试:
gdb + 调试的可执行程序:
3.退出调试:q
注:默认情况下,gdb无法对现在生成的出现进行调试,是因为在Linux操作系统中gcc或g++默认生成的是release版本,所以为了调试,需要对生成可执行程序改为debug版本!
如何生成debug版本呢?
gcc test.c -o test -g :加上-g命令
4.调试命令:
1.查看代码:l
默认一次显示10,想从0行开始,l 0,如果代码没有显示完整,可以使用回车键继续显示
2.打断点:
b + 打断点的行数:
3.查看打断点的信息:
info b
4.删除断点:
d + 断点编号
断点编号:
5.开始调试:r
到断点处停下来
6.逐过程调试:n
7.逐语句调试:s
8.断点跳跃:c
从当前断点直接运行到下一个断点处
9.查看调用堆栈:bt
10.运行完一个函数:finish
11.查看变量的值:p + 变量
p + 变量:只能观察当前的一次,在进入循环值发生变化时,如果想常显示变量的值使用display
undisplay + 对应的编号:取消常显示
12跳出循环:until + 循环代码结束的行数
总结
本篇文章总结了在Linux系统上如何进行编程的相关问题,这也是我们在使用Linux操作系统必备的基础知识,掌握好这些基础知识才能为我们以后深入学习Linux操作系统打下坚实的基础!